当前位置: 首页 > news >正文

石家庄公司网站设计论坛交流平台

石家庄公司网站设计,论坛交流平台,深圳市门户网站建设企业,苏州网站开发网站建立费用useReducer和useContext前面有单独介绍过#xff0c;上手不难#xff0c;现在我们把这两个api结合起来使用#xff0c;该怎么用#xff1f;还是结合之前的简易增删改查的demo#xff0c;熟悉vue的应该可以看出#xff0c;useReducer类似于vuex#xff0c;useContext类似…useReducer和useContext前面有单独介绍过上手不难现在我们把这两个api结合起来使用该怎么用还是结合之前的简易增删改查的demo熟悉vue的应该可以看出useReducer类似于vuexuseContext类似于vue中的inject和provided,来分析下思路。 实现效果 代码实现 文件拆解 组件入口文件 - index.js import { TasksContext, TasksDispatchContext } from ./context; import { useReducer } from react; import { initialTasks } from ./taskLists; import { taskReucers } from ./tasksReducer; import AddTask from ./AddTask; import TaskList from ./TaskList; function State() {const [tasks, dispatch] useReducer(taskReucers, initialTasks);return (TasksContext.Provider value{tasks}TasksDispatchContext.Provider value{dispatch}AddTask /TaskList //TasksDispatchContext.Provider/TasksContext.Provider); }export default State;AddTask.js import { useState, useContext } from react; import { TasksDispatchContext } from ./context; let nextId 3;function AddTask() {let [msg, setMsg] useState();const dispatch useContext(TasksDispatchContext);const handleSubmit () {if (!msg) return;setMsg();dispatch({type: added,task: {id: nextId,text: msg,done: false,},});};const handleChange (e) {setMsg(e.target.value);};return (input typetext value{msg} onChange{handleChange} /button onClick{handleSubmit}添加/button/); }export default AddTask; context.js文件 import { createContext } from react;export const TasksContext createContext(null); export const TasksDispatchContext createContext(null);taskReucers.js export function taskReucers(state [], action) {switch (action.type) {case added:return [...state, action.task];case changed:return state.map((task) {if (task.id action.task.id) {return action.task;} else return task;});case deleted:return state.filter((task) task.id ! action.task.id);default:throw new Error(Action type not found);} }taskListsData.js export const initialTasks [{ id: 0, text: Philosopher’s Path, done: true },{ id: 1, text: Visit the temple, done: false },{ id: 2, text: Drink matcha, done: false }, ];TaskList.js import { useState, useContext } from react; import Task from ./Task; import { TasksContext } from ./context;function TaskList() {const [isEdit, setIsEdit] useState(false);const tasks useContext(TasksContext);const handleChangeValue (value) {};return (ul{tasks.map((task) {return Task key{task.id} task{task} /;})}/ul); }export default TaskList;Task.js import { useState, useContext } from react; import { TasksDispatchContext } from ./context; function Task({ task }) {const [isEdit, setIsEdit] useState(false);const dispatch useContext(TasksDispatchContext);let todoContent ;function handleChangeText(e) {dispatch({ type: changed, task: { id: task.id, text: e.target.value } });}function handleDeleteTask(id) {dispatch({ type: deleted, task: { id } });}if (isEdit) {todoContent (spaninput typetext value{task.text} onChange{handleChangeText} /button onClick{() setIsEdit(false)}完成/button/span);} else {todoContent (spanspan{task.text}/spanbutton onClick{() setIsEdit(true)}编辑/button/span);}return (li{todoContent}button onClick{() handleDeleteTask(task.id)}删除/button/li); }export default Task;这样拆解后明显的业务更加清晰容易维护了给后续接手的人一目了然的理解思路。 没有了组件层级之间的繁琐的层层传递数据和方法代码结构也很清晰了。 进一步的优化业务代码 context.js的封装 import { createContext, useReducer } from react; import { initialTasks } from ./taskListsData; import { taskReucers } from ./tasksReducer;export const TasksContext createContext(null); export const TasksDispatchContext createContext(null);export default function TasksProvider({ children }) {const [tasks, dispatch] useReducer(taskReucers, initialTasks);return (TasksContext.Provider value{tasks}TasksDispatchContext.Provider value{dispatch}{children}/TasksDispatchContext.Provider/TasksContext.Provider); }入口文件index.js的优化 import AddTask from ./AddTask; import TaskList from ./TaskList; import TasksProvider from ./context; function State() {return (TasksProviderAddTask /TaskList //TasksProvider); }export default State;这样实现了同样的效果代码更加精简。
http://www.sczhlp.com/news/229266/

相关文章:

  • 密云青岛网站建设网站建设属于税收
  • 宿州哪家做网站不做骨干专业建设验收网站
  • 包头市做网站哪个网站设计首页
  • 运城市住房和城乡建设局网站男女做那个能看的视频网站
  • 如何用书签 做网站接口大数据营销的应用领域
  • python 兼职网站开发wordpress导入模板不一样
  • 网站商城如何获取流量找不到WordPress
  • 网站设计制作如何评价赞赏分享wordpress代码
  • 平台和自建网站服务提供者制作相册图片合集
  • 建设旅游网站财务分析施工企业质量管理体系认证几年
  • 做网站初级教程织梦 我的网站
  • 营销型网站建设哪家公司好seo专家是什么意思
  • 智慧旅游网站开发与设计网站内容编辑工具
  • 电子商务网站建设 试卷苏州网站制作网站建设
  • 深圳网站建设大全深圳网站制作必找祥奔科技
  • 邵阳网站优化电子商务专升本需要考些什么科目
  • 深圳网站建设 案例网站建设需要企业提供哪些素材
  • 网站建设服务网站建设wordpress 表单创建
  • 福建省建设工程造价站官方网站莞城网站仿做
  • 建设云网站网站的描述
  • 给web增加简单的ai对话功能
  • 租一个国外的服务器 建设网站如何做网赌网站
  • 小说网站有源码了该怎么做网站建设数据库ER图怎么画
  • 自己做网站打开很卡flashfxp上传多个网站
  • 化妆品公司网站模板新手如何做好网络营销推广
  • 商城网站前台模板免费下载200平米火锅店装修费用
  • 成品网站w灬源码1688网页版wordpress多域名
  • app 网站开发公司电话天元建设集团有限公司第九建筑工程公司
  • 晋中做网站公司网店网站技术方案
  • 景洪市新农村建设网站企业域名如何申请