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

wordpress带会员中心成都seo公司排名

wordpress带会员中心,成都seo公司排名,昆山做网站怎么做,网络系统架构师useReducer和useContext前面有单独介绍过,上手不难,现在我们把这两个api结合起来使用,该怎么用?还是结合之前的简易增删改查的demo,熟悉vue的应该可以看出,useReducer类似于vuex,useContext类似…

useReduceruseContext前面有单独介绍过,上手不难,现在我们把这两个api结合起来使用,该怎么用?还是结合之前的简易增删改查的demo,熟悉vue的应该可以看出,useReducer类似于vuexuseContext类似于vue中的injectprovided,来分析下思路。

实现效果请添加图片描述

代码实现

  • 文件拆解
    在这里插入图片描述
  • 组件入口文件 -> 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 type="text" 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 = (<span><input type="text" value={task.text} onChange={handleChangeText} /><button onClick={() => setIsEdit(false)}>完成</button></span>);} else {todoContent = (<span><span>{task.text}</span><button 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 (<TasksProvider><AddTask /><TaskList /></TasksProvider>);
}export default State;

这样实现了同样的效果,代码更加精简。
请添加图片描述

http://www.zhongyajixie.com/news/46299.html

相关文章:

  • 谷歌有做网站建设网站交易
  • 网站建设 软件开发的公司百度推广的定义
  • 镇江建设工程质量监督局网站建网站怎么赚钱
  • 深圳个人做网站网站互联网推广
  • 学设计的网站百度手机助手app官方下载
  • 男女做鸡视频网站企业管理培训课程网课
  • wordpress七牛不显示小图佛山做seo推广公司
  • 如何查看网站在哪里做的电商平台排行榜前十名
  • 西安有哪些做网站的公司好网络营销郑州优化推广公司
  • 易经网站开发公司天津seo优化公司
  • 怎么买域名建网站关键词挖掘排名
  • 河南英文网站建设公司广东seo推广贵不贵
  • 做党建网站除了小红书还有什么推广平台
  • 偷dede网站模板长春疫情最新情况
  • 设计网站的结构时下面哪个方法不好聚合搜索引擎
  • 凡科做网站关键词自媒体运营
  • 宿迁网站制作潍坊关键词优化排名
  • 国外flash网站欣赏如何做推广推广技巧
  • 怎么申请网站域名赚钱建站流程
  • 网站建设需要多久google国际版
  • 用模板做网站教程seo培训学校
  • 网站开发需要什么软件简述网站建设的一般流程
  • 做网站找哪家最好淘宝推广工具
  • 新1站网站建设南昌seo建站
  • 做的网站上传到服务器吗目前好的推广平台
  • wordpress新手主题青岛网站建设方案优化
  • 在线做网站有哪些平台技能培训班
  • 做经营行网站需要什么合肥全网推广
  • 建设网站能解决什么问题网站优化服务
  • 哈尔滨网站开发联系薇竞价托管公司联系方式