国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

wordpress評論樓廣州百度seo排名

wordpress評論樓,廣州百度seo排名,web1.0 網(wǎng)站開發(fā),域名備案信息useReducer和useContext前面有單獨(dú)介紹過,上手不難,現(xiàn)在我們把這兩個(gè)api結(jié)合起來使用,該怎么用?還是結(jié)合之前的簡易增刪改查的demo,熟悉vue的應(yīng)該可以看出,useReducer類似于vuex,useContext類似…

useReduceruseContext前面有單獨(dú)介紹過,上手不難,現(xiàn)在我們把這兩個(gè)api結(jié)合起來使用,該怎么用?還是結(jié)合之前的簡易增刪改查的demo,熟悉vue的應(yīng)該可以看出,useReducer類似于vuexuseContext類似于vue中的injectprovided,來分析下思路。

實(shí)現(xiàn)效果請?zhí)砑訄D片描述

代碼實(shí)現(xiàn)

  • 文件拆解
    在這里插入圖片描述
  • 組件入口文件 -> 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;

這樣拆解后,明顯的業(yè)務(wù)更加清晰,容易維護(hù)了,給后續(xù)接手的人一目了然的理解思路。
沒有了組件層級之間的繁瑣的層層傳遞數(shù)據(jù)和方法,代碼結(jié)構(gòu)也很清晰了。


進(jìn)一步的優(yōu)化業(yè)務(wù)代碼

  • 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的優(yōu)化
import AddTask from "./AddTask";
import TaskList from "./TaskList";
import TasksProvider from "./context";
function State() {return (<TasksProvider><AddTask /><TaskList /></TasksProvider>);
}export default State;

這樣實(shí)現(xiàn)了同樣的效果,代碼更加精簡。
請?zhí)砑訄D片描述

http://aloenet.com.cn/news/44977.html

相關(guān)文章:

  • 如何給網(wǎng)站做宣傳aso優(yōu)化費(fèi)用
  • 永州做網(wǎng)站費(fèi)用做百度線上推廣
  • 莆田交友網(wǎng)站市場惠州網(wǎng)站建設(shè)方案推廣
  • 東莞專業(yè)網(wǎng)站建設(shè)推廣seo屬于什么
  • 如何簡述網(wǎng)站建設(shè)流程seo是什么?
  • 網(wǎng)站整體運(yùn)營思路競價(jià)推廣托管服務(wù)
  • 車輛對比那個(gè)網(wǎng)站做的好免費(fèi)網(wǎng)絡(luò)推廣的方法
  • 昆明利于優(yōu)化的網(wǎng)站河南自助建站seo公司
  • 佛山營銷網(wǎng)站建設(shè)seo快速工具
  • 長春網(wǎng)站建設(shè)58同城想在百度做推廣怎么做
  • 國外做家譜的網(wǎng)站開發(fā)小程序
  • 網(wǎng)站建設(shè)要學(xué)會(huì)編程嗎網(wǎng)站的營銷推廣方案
  • 國外網(wǎng)站設(shè)計(jì)網(wǎng)站昆明百度推廣開戶
  • wordpress 網(wǎng)頁目錄下湖南專業(yè)seo公司
  • 小貸網(wǎng)站需要多少錢可以做seo快速排名優(yōu)化方法
  • 做導(dǎo)航網(wǎng)站犯法嗎web網(wǎng)頁制作教程
  • 教師可以做網(wǎng)站嗎最近熱點(diǎn)新聞事件
  • 寧國做網(wǎng)站優(yōu)化營商環(huán)境的措施建議
  • 網(wǎng)站的域名可以修改嗎做營銷策劃的公司
  • 網(wǎng)站如何做口碑營銷大數(shù)據(jù)
  • 專門做水果的網(wǎng)站重慶seo優(yōu)化效果好
  • wordpress底部插件超級seo助手
  • 可以免費(fèi)看日本黃片的app做網(wǎng)站上海單個(gè)關(guān)鍵詞優(yōu)化
  • 單頁面網(wǎng)站推廣重慶seo推廣運(yùn)營
  • 優(yōu)化網(wǎng)站排名方法教程怎樣自己做網(wǎng)站
  • 武漢++外貿(mào)網(wǎng)站建設(shè)千瓜數(shù)據(jù)
  • 星空無限傳媒官網(wǎng)免費(fèi)下載seo服務(wù)收費(fèi)
  • 化妝品網(wǎng)站系統(tǒng)規(guī)劃58同城安居客
  • 南昌市有幫做網(wǎng)站的嗎作品提示優(yōu)化要?jiǎng)h嗎
  • 江蘇專業(yè)網(wǎng)站建設(shè)網(wǎng)絡(luò)營銷站點(diǎn)推廣的方法