• react中reducer+上下文实战


    App.js

    import { AddTask } from './utils/AddTask'
    import { TaskList } from './utils/TaskList'
    import { TasksProvider } from "./utils/TaskContext"
    
    function App() {
      return (
            <>
             <TasksProvider>
                <AddTask />
                <TaskList />
              </TasksProvider>
            </>
      )
    }
    
    export default App
    

    TaskList.js

    import { useState } from "react"
    import { useTasks, useTasksDispatch } from "./TaskContext"
    
    export function TaskList() {
        const tasks = useTasks()
        return (
          <ul>
            {tasks.map(task => (
              <Item task={task} key={task.id} />
            ))}
          </ul>
        )
    }
    export function Item({task}) {
        const dispatch = useTasksDispatch()
        const [isEditing, setIsEditing] = useState(false)
        const [text, setText] = useState(task.text)
        const [isChecked, setIsChecked] = useState(task.done)
        function handleClick() {
            setIsEditing(false)
            dispatch({
                type: "change",
                task: {...task, text, done: isChecked}
            })
        }
        return (
            <li>
            <label>
                <input type="checkbox" checked={isChecked} onChange={e => setIsChecked(!isChecked)} />
                {!isEditing ? (
                <>
                    <span>{task.text}</span>
                    <button onClick={() => setIsEditing(true)}>Edit</button>
                </>
                ) : (
                <>
                    <input value={text} onChange={e => setText(e.target.value)} />
                    <button onClick={handleClick}>Save</button>
                </>
                )}
                <button onClick={e => {
                    dispatch({type: "del", taskId: task.id})
                }}>Delete</button>
            </label>
            </li>
        )
    }
    

    AddTask.js

    import { useState } from "react"
    import { useTasksDispatch } from "./TaskContext"
    
    export function AddTask() {
        const dispatch = useTasksDispatch()
        const [text, setText] = useState("")
        function handleClick() {
            dispatch({type: "add", text})
            setText("")
        }
        return (
            <>
            <input value={text} onChange={e => setText(e.target.value)} />
            <button onClick={handleClick}>Add</button>
            </>
        )
    }
    

    TaskContext.js

    import { createContext, useContext } from "react"
    import { useReducer } from "react"
    
    const TaskContext = createContext(null)
    const TaskDispatchContext = createContext(null)
    
    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},
    ]
    let nextId = initialTasks.length
      
    function tasksReducer(tasks, action) {
        switch (action.type) {
        case "add": {
            return [
            ...tasks,
            {
                id: nextId++,
                text: action.text,
                done: false
            }
            ]
        }
        case "change": {
            return tasks.map(task => {
            if (task.id === action.task.id) {
                return action.task
            } else {
                return task
            }
            })
        }
        case "del": {
            return tasks.filter(task => task.id !== action.taskId)
        }
        default: {
            throw new Error(`位置的类型:${action.type}`)
        }
        }
    }
    
    export function useTasks() {
        return useContext(TaskContext)
    }
    export function useTasksDispatch() {
        return useContext(TaskDispatchContext)
    }
    export function TasksProvider({children}) {
        const [tasks, dispatch] = useReducer(tasksReducer, initialTasks)
    
        return (
            <TaskContext.Provider value={tasks}>
                <TaskDispatchContext.Provider value={dispatch}>
                    {children}
                </TaskDispatchContext.Provider>
            </TaskContext.Provider>
        )
    }
    
  • 相关阅读:
    Contention Based Energy Efficient Wireless Sensor Network – A survey
    在浏览器中输入url回车后发生了什么
    安卓APP源码和设计报告——麻雀笔记
    Android 项目Gradle文件讲解(Groovy和Kotlin)
    面试面经|Java面试kafka面试题
    【云原生之k8s】Helm 工具安装
    php实现一个简单的MySQL分页
    Netgear R6700v3 1.0.4.102(CVE-2021-27239)
    Word中Endnote加载项不见了怎么处理?
    什么牌子的蓝牙耳机耐用又便宜?好用的蓝牙耳机品牌推荐
  • 原文地址:https://blog.csdn.net/weixin_42289273/article/details/139317552