首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在preact中重用"add todo“组件作为"edit todo”

在Preact中重用“Add Todo”组件作为“Edit Todo”组件是一个常见的需求,可以通过传递不同的props来实现。以下是详细的概念、优势、类型、应用场景以及示例代码。

基础概念

组件重用:在React或Preact中,组件重用是指将一个组件的逻辑和UI在不同的上下文中使用。通过传递不同的props,可以使同一个组件在不同的场景下表现出不同的行为。

优势

  1. 代码复用:减少重复代码,提高开发效率。
  2. 维护性:统一管理组件的逻辑,便于维护和更新。
  3. 灵活性:通过props动态调整组件行为,适应不同的需求。

类型

  • 功能重用:同一个组件在不同场景下执行不同的功能。
  • 样式重用:共享相同的样式或主题。

应用场景

  • 表单组件:如“Add Todo”和“Edit Todo”。
  • 列表项组件:显示不同类型的数据。
  • 通用UI组件:按钮、输入框等。

示例代码

假设我们有一个“Add Todo”组件,可以通过传递不同的props将其重用为“Edit Todo”组件。

AddTodo.js

代码语言:txt
复制
import { h, Component } from 'preact';

class AddTodo extends Component {
  state = {
    title: '',
    description: ''
  };

  handleChange = (e) => {
    this.setState({ [e.target.name]: e.target.value });
  };

  handleSubmit = (e) => {
    e.preventDefault();
    const { title, description } = this.state;
    if (this.props.isEditing) {
      // 调用编辑逻辑
      this.props.onEdit({ title, description });
    } else {
      // 调用添加逻辑
      this.props.onAdd({ title, description });
    }
    this.setState({ title: '', description: '' });
  };

  render() {
    const { title, description } = this.state;
    return (
      <form onSubmit={this.handleSubmit}>
        <input
          type="text"
          name="title"
          value={title}
          onChange={this.handleChange}
          placeholder="Title"
        />
        <textarea
          name="description"
          value={description}
          onChange={this.handleChange}
          placeholder="Description"
        />
        <button type="submit">{this.props.isEditing ? 'Edit Todo' : 'Add Todo'}</button>
      </form>
    );
  }
}

export default AddTodo;

使用示例

代码语言:txt
复制
import { h } from 'preact';
import AddTodo from './AddTodo';

const App = () => {
  const handleAdd = (todo) => {
    console.log('Adding todo:', todo);
  };

  const handleEdit = (todo) => {
    console.log('Editing todo:', todo);
  };

  return (
    <div>
      <AddTodo onAdd={handleAdd} />
      <AddTodo isEditing onEdit={handleEdit} />
    </div>
  );
};

export default App;

解决常见问题

1. 如何区分添加和编辑模式?

通过传递isEditing prop来区分模式,并在组件内部根据该prop执行不同的逻辑。

2. 如何处理初始数据?

如果是在编辑模式下,可以在组件外部计算好初始数据,并通过props传递给组件。

代码语言:txt
复制
<AddTodo isEditing initialData={initialTodoData} onEdit={handleEdit} />

然后在组件内部使用componentDidMountuseEffect来设置初始状态。

代码语言:txt
复制
componentDidMount() {
  if (this.props.isEditing && this.props.initialData) {
    this.setState(this.props.initialData);
  }
}

通过这种方式,可以灵活地在Preact中重用组件,提高开发效率和代码的可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 一步一步学Vue(三)

    我理解的组件化就是把内容分块,把业务分块,把结构分块,可能还有其它维度;所谓分块其实专业一点可以称为封装,封装、继承、多态是面向对象中的概念,但是也是代码重用的一种手段,我们对代码、对系统进行组件化也是代码重用的一种手段...举个简单的例子,在H5发布之后,新增了几个复杂标签,比如video,audio等,这种本质上是什么东西呢,为什么浏览器遇到这个标签都能渲染出一个播放窗口呢,请看下图:   我在Html中添加了一个video...2、Vue中的组件   Vue中注册组件有两种方式:全局注册和局部注册;全局注册通过component方法进行注册,在Vue实例对象的作用于内都可以直接使用;局部注册通过给Vue实例中的components...传值是web开发中很重要的一个环节;在熟悉的angular中,父子controller传值可以通过emit 和 broadcast ,前者向上传播,后者向下传播;但是并不建议使用后者,因为后者在传递过程中会遍历所有的同级节点...而向组件或者指令中传值,angular有自己的绑定策略,那么Vue中是不是也有类似的机制呢。没错,在Vue中建议的方式就是“props in ,event out”。

    60610

    一步一步学Vue(四)

    ,使用props传入;其实我们仔细分析我们的两个组件,都是为了渲染列表数据,至于是在组件外请求还是在组件内请求,它是不关注的,这样我们可以进一步考虑,把AB组件重构成只用来渲染数据的pure组件,数据由外部传入...,其它组件都是傻白甜,这样的好处是,其它组件容易重用,因为只是数据渲染,并不涉及业务操作,这种组件没有业务相关性,比如一个list组件我可以用它显示用户信息,当然也可以用它显示角色信息,根据传入的数据而变化...$on("onxxx",function(e,data){ //TODO: }) 但是在vue中$on是直接使用v-on:onxxx或@onxxx来写的,所以一般存在的是这样的代码: todo-list...,它的每一个列表项我们进行了一次封装,每一个list中的列表项,就是一个TodoItem组件,所以在TodoItem组件中,只需要引入todoitem数据即可,唯一需要关注的就是todoItem组件中会触发...(更逼格高一些,叫状态),所以在todoitem组件中触发的事件没办法直接到TodoContainer组件中,只能通过一级一级的往上传递,所以在todolist中也有和todoitem中类似的触发事件的代码

    1.2K10

    vue业务组件封装_怎么去设计一个组件封装

    组件间传值——父给子传值 一、组件 组件是拥有专属的 HTML+JS+CSS+数据 的可重用的独立的页面功能区域,如果发现网页中有一个功能,可能被多处反复使用,都应封装为组件。...return一个新对象{} //HTML片段仍需写在唯一的父元素中 (2)在页面中使用组件 组件名>组件名> 组件的使用过程 (1)每当拿到一个页面后,先划分组件区域,根据3个原则:位置、功能、是否重用; (2)为每个组件创建独立的js文件,来保存组件的代码; (3)回到原页面中引入并使用组件标签,将组件重新拼接回一个完整的页面...在父组件界面中 组件标签名>组件标签名> ---- 举例: 实现待办事项列表的界面部分划分组件; 组件todo.js Vue.component("todo", { template...:{ props:[ "自定义属性名" ] } //在子组件内,props中的属性用法和data中的变量用法完全一样 //差别在于props的属性值来自于外部传入,data中的变量值由自己定义

    2.1K10

    kbone,十分钟让 Vue 项目同时支持小程序

    基本结构 首先,我们来看下一个基本的 kbone 项目的目录结构(这里的 todo 是基于 Vue 的示例,kbone 也有 React,Preact,Omi 等版本,详情可移步 kbone github.../todo.vue' new Vue({ el: '#app', render: h => h(todo) }) todo.vue 在上面的入口图可以看到,源码目录中,除了入口文件分开之前,页面文件就是共用的了...Web 端配置为正常的 Vue 配置,小程序端配置与 Web 端配置的唯一不同就是需要引入 mp-webpack-plugin 插件来将 Vue 组件转化为小程序代码。 [0?...构建完成后,生产代码会位于 dist 目录中。...进入 dist/mp 目录,执行 npm install 安装依赖,用开发者工具将 dist/mp 目录作为小程序项目导入之后,点击工具栏下的 构建 npm,即可预览效果。

    60441

    一步一步学习Vue(十一)

    ,由于在每一个组件中都可以访问到this....$store,那么我们就不用对事件一层一层的传递啦,我们只需要在需要调用的地方,commit对应的mutation即可,比如search操作就是在searchbar组件中,那么我们没必要传递到父组件中来触发...,现在每个组件的逻辑都是它自己负责,表单组件负责保存操作,所以在其中提交commit(“save”);todo组件负责编辑和删除,所以在其方法中封装了remove和edit的mutaiton的访问。...由于其状态的响应式,所以我们在访问时一般定义成计算属性,如TodoContainer组件中的initItem和items;一般来说,不是所有状态都要定义到vuex的store中,每个组件都会有自己私有状态...,只有全局或者共享状态才适合定义在store中,所以在实际开发中,需要好好斟酌;本篇就到此为止,其实算是上篇的一个延伸,下一篇介绍Actions,会继续在本篇demo的基础上进行延伸,敬请期待。

    71820

    《深入浅出Dart》Flutter实战之TODO应用

    现代JavaScript高级小册 深入浅出Dart 现代TypeScript高级小册 Flutter实战之TODO应用 在本篇文章中,我们将构建一个TODO应用,使用最新的Dart语法和Flutter框架...}); } } } 在这段代码中,我们创建了一个TodoListScreen类作为任务列表页面,它是一个有状态的小部件。...在lib/screens/todo_edit_screen.dart中创建一个新的Dart文件,并添加以下代码: import 'package:flutter/material.dart'; import...'Add Todo' : 'Edit Todo'), ), body: Padding( padding: EdgeInsets.all(16.0),...在initState方法中,我们初始化了文本编辑器的控制器,并根据传入的任务初始化了相应的值。 在build方法中,我们使用Scaffold和Column来显示标题、描述和完成状态的输入字段。

    26220

    vue-cli的项目结构

    vue的基本语法,后面会陆续加入vuex和vue-router的使用 Vue Vue语言有非常强的灵活性,可以直接在HTML页面中通过引入其js文件使用,也可以作为一个完整的项目使用。...因此可以在App.vue文件中定义整个项目最通用的结构比如Header,Sidebar等等。其它情况下也可以不对其进行任何修改。...components文件夹和views文件夹都用来存储模板,不同的是views文件夹中的内容对应一个完整的页面,而components中的内容对应各个可重用的元素。...在不指定版本号的情况下会下载最新版本 npm run dev: 运行开发配置下的项目,我们用这个指令在开发过程中启动项目并debug 进入代码 该todo来自于vue官网上,需要查看源码的可以去官网的github...我们在使用npm run dev查看一下运行结果: ? 主要的组件都位于components之下: ? 分别对应着新建Todo模块,单个Todo展示页面和Todo列表模块。

    89340
    领券