react中reducer+上下文实战

ops/2024/10/19 4:21:51/

APP.js文件

javascript">import { useReducer, createContext, useContext } from "react"
import AddTask from "./components/AddTask"
import TaskList from "./components/TaskList"const initialTasks = [{ id: 0, text: 'Visit Kafka Museum', done: true },{ id: 1, text: 'Watch a puppet show', done: false },{ id: 2, text: 'Lennon Wall pic', done: false }
]
function tasksReducer(tasks, action) {switch (action.type) {case "added":return [...tasks, {id: action.id,text: action.text,done: false}]case "changed":return tasks.map(t => {if (t.id === action.task.id) {// return action.taskreturn {...action.task, done: !action.task.done}} else {return t}})case "saved":return tasks.map(t => {if (t.id === action.id) {return {...t, text: action.text}} else {return t}})case "deleted":return tasks.filter(t => t.id !== action.id)default:// 主动抛出异常throw Error("Unknown action" + action.type)}
}const TaskContext = createContext(null)
export function useTasks() {return useContext(TaskContext)
}
const TaskDispatchContext = createContext(null)
export function useTasksDispatch() {return useContext(TaskDispatchContext)
}function App() {// useReducer Hooks函数:用于管理组件的状态和状态更新const [tasks, dispatch] = useReducer(tasksReducer, initialTasks)return (<><TaskContext.Provider value={tasks}><TaskDispatchContext.Provider value={dispatch}><h1>Prague itinerary</h1><AddTask /><TaskList /></TaskDispatchContext.Provider></TaskContext.Provider></>)
}export default App

AddTask.js

javascript">import { useState } from "react"
import { useTasksDispatch } from "../App" export default function AddTask() {const [text, setText] = useState("")const dispatch = useTasksDispatch()return (<><input value={text} placeholder="Add task" onChange={e => {setText(e.target.value)}}></input><button onClick={() => {// onAddTask(text)dispatch({type: "added",id: Date.now(),text: text})setText("")}}>Add</button></>)
}

TaskList.js

javascript">import { useState } from "react"
import { useTasks, useTasksDispatch } from "../App"export default function TaskList() {const tasks = useTasks()return (<ul>{tasks.map(t => ( <li key={t.id}><Item t={t} /></li>))}</ul>)
}function Item({ t }) {const [text, setText] = useState("")const [status, setStatus] = useState(0)const dispatch = useTasksDispatch()return (<><inputchecked={t.done}onChange={e => {dispatch({type: "changed",task: {...t, done: !e.target.checked}})}}type="checkbox" />{!status ?<>{t.text} {" "}<button onClick={e => {setStatus(!status)setText(t.text)}}>Edit</button></>: <><input value={text} onChange={e => {setText(e.target.value)}} /> {" "}<button onClick={e => {setStatus(!status)// onSaveTask(text, t.id)dispatch({type: "saved",text: text,id: t.id})}}>Save</button></>}<button onClick={e => {dispatch({type: "deleted",id: t.id})}}>delete</button></>)
}

http://www.ppmy.cn/ops/47106.html

相关文章

PLC编程软件是什么:深入解析与全面指南

PLC编程软件是什么&#xff1a;深入解析与全面指南 在工业自动化和数字控制领域&#xff0c;PLC编程软件扮演着至关重要的角色。那么&#xff0c;PLC编程软件究竟是什么呢&#xff1f;本文将从四个方面、五个方面、六个方面和七个方面为您深入解析这一话题&#xff0c;带您领略…

三、基于图像分类预训练编码及图神经网络的预测模型 【框图+源码】

背景&#xff1a; 抽时间补充&#xff0c;先挖个坑。 一、模型结构 二、源码

HBase 常用 shell 操作

下面给大家介绍一些HBase 常用 shell 操作&#xff0c;各位看官看好了啦&#xff0c;我要献丑了。 进入 HBase 客户端命令操作界面 $ bin/hbase shell查看帮助命令 > help查看当前数据库中有哪些表 > list创建一张表 创建 user 表&#xff0c;包含 info、data 两个列…

建筑行业人防乙级的动态考核要点

专业技术人员维持&#xff1a;检查企业是否持续拥有符合资质标准的专业技术人员&#xff0c;包括但不限于注册建筑师、结构工程师、防护工程师、给排水工程师、通信保护工程师等&#xff0c;以及他们的执业资格是否有效、专业能力是否持续提升。 业绩与项目质量&#xff1a;评…

Github 2024-06-04 Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-04统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10Shell项目1TypeScript项目1yt-dlp: 一个增强版的youtube-dl分支 创建周期:1184 天开发语言:Python协议类型:The UnlicenseStar数…

16、matlab求导、求偏导、求定积分、不定积分、数值积分和数值二重积分

1、matlab求导,diff()函数 1)一阶导数 语法:diff(f(x)):求一阶导数 //diff(f(x),n):求n阶导数(n为具体正整数) 以函数(cos(x)+sin(x)-x^2)的一阶导数为例 一阶导数代码: yms x;%声明符号变量x f(x)=cos(x)+sin(x)-x^2;%定义原式子 dy=diff(f(x))%求一阶导数dy =cos(…

富格林:揭露黑幕平台保障安全

富格林指出&#xff0c;很多黑幕平台都会将自己包装得光鲜亮丽后&#xff0c;再出来诱惑投资者&#xff0c;使得投资者资金安全得不到保障&#xff0c;有苦说不出。富格林表示&#xff0c;黑幕平台的套路其实是非常常见的&#xff0c;只要投资者熟知并能够分辨出&#xff0c;就…

你知道SPI的原理以及实现?

1、什么是SPI&#xff1f; SPI&#xff08;Service Provider Interface&#xff09;&#xff0c;是JDK内置的一种服务提供发现机制&#xff0c;可以用来启用框架扩展和替换组件&#xff0c;主要是被框架的开发人员使用&#xff0c;比如 java.sql.Driver 接口&#xff0c;其他不…