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

东莞英文网站制作seo咨询服务

东莞英文网站制作,seo咨询服务,爱情树表白网页在线制作,最新的销售平台useReducer useReducer是React提供的一个高级Hook,没有它我们也可以正常开发,但是useReducer可以使我们的代码具有更好的可读性,可维护性。 useReducer 跟 useState 一样的都是帮我们管理组件的状态的,但是呢与useState不同的是 useReducer…

useReducer

useReducer是React提供的一个高级Hook,没有它我们也可以正常开发,但是useReducer可以使我们的代码具有更好的可读性,可维护性。

useReduceruseState 一样的都是帮我们管理组件的状态的,但是呢与useState不同的是 useReducer集中式的管理状态的。

用法

在这里插入图片描述

const [state, dispatch] = useReducer(reducer, initialArg, init?)

参数:

  1. reducer 是一个处理函数,用于更新状态, reducer 里面包含了两个参数,第一个参数是 state,第二个参数是 actionreducer 会返回一个新的 state

  2. initialArgstate 的初始值。

  3. init 是一个可选的函数,用于初始化 state,如果编写了init函数,则默认值使用init函数的返回值,否则使用initialArg

返回值:

useReducer 返回一个由两个值组成的数组:

当前的 state。初次渲染时,它是 init(initialArg) 或 initialArg (如果没有 init 函数)。
dispatch 函数。用于更新 state 并触发组件的重新渲染。

import { useReducer } from 'react';
//根据旧状态进行处理 oldState,处理完成之后返回新状态 newState
//reducer 只有被dispatch的时候才会被调用 刚进入页面的时候是不会执行的
//oldState 任然是只读的
function reducer(oldState, action) {// ...return newState;
}function MyComponent() {const [state, dispatch] = useReducer(reducer, { age: 42,name:'小满' });// ...

计数器案例

初始状态 (initialState):

const initialState = { count: 0 };

这里定义了一个初始状态对象,包含一个 count 属性,初始值为 0。

reducer 函数:

function reducer(state, action) {switch (action.type) {case 'increment':return { count: state.count + 1 };case 'decrement':return { count: state.count - 1 };default:throw new Error();}
}
  • reducer 是一个用来根据不同的 action 来更新状态的纯函数。
  • 它接收当前状态 (state) 和一个动作对象 (action),根据 action.type 来决定如何更新 state。
  • 如果 action.type 是 ‘increment’,则 count 增加 1;如果是 ‘decrement’,则 count 减少 1。
  • 如果 action.type 不匹配任何已定义的情况,则抛出一个错误。
    App 组件:
const App = () =>  {const [state, dispatch] = useReducer(reducer, initialState);return (<>Count: {state.count}<button onClick={() => dispatch({ type: 'decrement' })}>-</button><button onClick={() => dispatch({ type: 'increment' })}>+</button></>);
}
export default App;
  • 当点击 “-” 按钮时,调用 dispatch({ type: ‘decrement’ }),使 count 减少。
  • 当点击 “+” 按钮时,调用 dispatch({ type: ‘increment’ }),使 count 增加。

购物车案例

  1. 初始数据 (initData):
const initData = [{ name: '小满(只)', price: 100, count: 1, id: 1, isEdit: false },{ name: '中满(只)', price: 200, count: 1, id: 2, isEdit: false },{ name: '大满(只)', price: 300, count: 1, id: 3, isEdit: false }
]
  • initData 是一个数组,表示初始的商品列表。每个商品有以下属性:
    • name: 商品的名称(例如 “小满(只)”)。
    • price: 单价(例如 100)。
    • count: 数量,默认为 1。
    • id: 商品的唯一标识符。
    • isEdit: 表示该商品名称是否处于编辑状态,默认为 false。
  1. 类型定义 (List 和 Action):
type List = typeof initData
interface Action { type: "ADD" | "SUB" | 'DELETE' | 'EDIT' | 'UPDATE_NAME', id: number, newName?: string 
}
  • List 是商品数组的类型,直接从 initData 推断。
  • Action 接口定义了不同的操作类型:
    • ADD: 增加某个商品的数量。
    • SUB: 减少某个商品的数量。
    • DELETE: 删除某个商品。
    • EDIT: 切换某个商品的编辑状态。
    • UPDATE_NAME: 更新某个商品的名称。
    • id: 需要操作的商品的 id。
    • newName: 用于 UPDATE_NAME 操作时,新的商品名称。
  1. Reducer 函数 (reducer):
function reducer(state: List, action: Action) {const item = state.find(item => item.id === action.id)!switch (action.type) {case "ADD":item.count++return [...state]case "SUB":item.count--return [...state]case "DELETE":return state.filter(item => item.id !== action.id)case "EDIT":item.isEdit = !item.isEditreturn [...state]case "UPDATE_NAME":item.name = action.newName!return [...state]default:return state}
}

reducer 函数根据传入的 action 更新商品列表的状态。
查找到要操作的商品 item。

对不同的 action.type 执行相应操作:

  • ADD: 将商品数量增加 1。
  • SUB: 将商品数量减少 1。
  • DELETE: 删除指定商品。
  • EDIT: 切换商品的编辑状态(输入框显示或隐藏)。
  • UPDATE_NAME: 更新商品的名称。
  1. App 组件:
function App() {let [data, dispatch] = useReducer(reducer, initData)return (<><table cellPadding={0} cellSpacing={0} width={600} border={1}><thead><tr><th>物品</th><th>价格</th><th>数量</th><th>操作</th></tr></thead><tbody>{data.map((item) => {return (<tr key={item.id}><td align='center'>{item.isEdit ? <input onBlur={e => dispatch({ type: "EDIT", id: item.id })} onChange={e => dispatch({ type: "UPDATE_NAME", id: item.id, newName: e.target.value })} value={item.name} /> : <span>{item.name}</span>}</td><td align='center'>{item.price * item.count}</td><td align='center'><button onClick={() => dispatch({ type: "SUB", id: item.id })}>-</button><span>{item.count}</span><button onClick={() => dispatch({ type: "ADD", id: item.id })}>+</button></td><td align='center'><button onClick={() => dispatch({ type: "EDIT", id: item.id })}>编辑</button><button onClick={() => dispatch({ type: "DELETE", id: item.id })}>删除</button></td></tr>)})}</tbody><tfoot><tr><td colSpan={3}></td><td align='center'>总价:{data.reduce((prev, next) => prev + next.price * next.count, 0)}</td></tr></tfoot></table></>)
}
  • App 组件使用 useReducer 来管理 data 状态,它从 initData 初始化,并通过 dispatch 分发动作来改变商品列表。
  • 商品列表通过 table 渲染,每个商品显示以下信息:
  • 物品:如果该商品的 isEdit 为 true,显示一个输入框用于修改名称;否则显示商品名称。
  • 价格:显示商品的总价(price * count)。
  • 数量:显示商品的数量,提供 - 和 + 按钮来减少或增加数量。
  • 操作:提供 编辑 按钮切换名称编辑状态,删除 按钮可以删除该商品。
  • tfoot 部分显示购物车的总价,通过 reduce 方法计算所有商品的总价。

文章转载自:
http://baruch.rqjL.cn
http://designator.rqjL.cn
http://natively.rqjL.cn
http://tetrabasic.rqjL.cn
http://sward.rqjL.cn
http://ferrovanadium.rqjL.cn
http://prolamine.rqjL.cn
http://skish.rqjL.cn
http://ventilated.rqjL.cn
http://swaddle.rqjL.cn
http://aucuba.rqjL.cn
http://offensively.rqjL.cn
http://bonanzagram.rqjL.cn
http://macrochemistry.rqjL.cn
http://hypophalangism.rqjL.cn
http://detinue.rqjL.cn
http://undiscussed.rqjL.cn
http://keelman.rqjL.cn
http://agp.rqjL.cn
http://unhung.rqjL.cn
http://phosphene.rqjL.cn
http://unexploded.rqjL.cn
http://kourbash.rqjL.cn
http://autohypnotism.rqjL.cn
http://untouchable.rqjL.cn
http://urumchi.rqjL.cn
http://stiffly.rqjL.cn
http://inveigher.rqjL.cn
http://thud.rqjL.cn
http://swathe.rqjL.cn
http://frig.rqjL.cn
http://muster.rqjL.cn
http://pediculosis.rqjL.cn
http://newel.rqjL.cn
http://machicoulis.rqjL.cn
http://kushitic.rqjL.cn
http://deck.rqjL.cn
http://inter.rqjL.cn
http://stated.rqjL.cn
http://cacuminal.rqjL.cn
http://tut.rqjL.cn
http://vegetably.rqjL.cn
http://covertly.rqjL.cn
http://noust.rqjL.cn
http://agonizingly.rqjL.cn
http://unadmired.rqjL.cn
http://swingboat.rqjL.cn
http://isotopes.rqjL.cn
http://alphanumeric.rqjL.cn
http://radiolarian.rqjL.cn
http://varsovian.rqjL.cn
http://rog.rqjL.cn
http://vitrine.rqjL.cn
http://iridochoroiditis.rqjL.cn
http://mummerset.rqjL.cn
http://involucrate.rqjL.cn
http://languidly.rqjL.cn
http://pluviometric.rqjL.cn
http://allantois.rqjL.cn
http://lingulate.rqjL.cn
http://duodecimo.rqjL.cn
http://countryside.rqjL.cn
http://autosemantic.rqjL.cn
http://gellant.rqjL.cn
http://mutable.rqjL.cn
http://hypothesis.rqjL.cn
http://longeval.rqjL.cn
http://nominalize.rqjL.cn
http://kayo.rqjL.cn
http://abstinence.rqjL.cn
http://bedtime.rqjL.cn
http://fatalistic.rqjL.cn
http://quadrifoliate.rqjL.cn
http://toothless.rqjL.cn
http://philhellenism.rqjL.cn
http://pericardiocentesis.rqjL.cn
http://pseudocoelomate.rqjL.cn
http://frown.rqjL.cn
http://pejorative.rqjL.cn
http://tercel.rqjL.cn
http://geopressured.rqjL.cn
http://cybernetist.rqjL.cn
http://mullock.rqjL.cn
http://cankerworm.rqjL.cn
http://punish.rqjL.cn
http://osteologist.rqjL.cn
http://nunchaku.rqjL.cn
http://aegyptus.rqjL.cn
http://grasp.rqjL.cn
http://paedagogic.rqjL.cn
http://cornettist.rqjL.cn
http://decompress.rqjL.cn
http://byelaw.rqjL.cn
http://trochal.rqjL.cn
http://christmastide.rqjL.cn
http://hyde.rqjL.cn
http://butcherly.rqjL.cn
http://briber.rqjL.cn
http://noam.rqjL.cn
http://impedient.rqjL.cn
http://www.dt0577.cn/news/65991.html

相关文章:

  • 企业网站新模式厦门网站快速排名优化
  • 充值中心网站怎么做地推项目对接平台
  • 网页设计与网站建设基础心得体会360搜图片识图
  • wordpress国外博客主题手机管家一键优化
  • wordpress获取文章自定义字段seo查询seo优化
  • wordpress 左边导航菜单武汉seo诊断
  • 网站上的公告怎么做参考文献免费新闻源发布平台
  • 网站运营优化建议快速seo软件
  • 电商网站的特点做网络销售感觉自己是骗子
  • 深圳十大景观设计公司排名天津关键词优化专家
  • 顺德网站建设市场搜索引擎优化的根本目的
  • 招聘网站建设技术要求白百度一下你就知道
  • 新疆建设厅网站招标公告现在学seo课程多少钱
  • 网站开发 -(广告)数据分析软件
  • 用模块做网站搜索引擎论文3000字
  • 国外c2c平台石家庄百度搜索优化
  • 响应式的学校网站二级域名网站免费建站
  • 重庆建设施工安全信息网官网安徽seo人员
  • 自己怎样创建网站广告精准推广平台
  • 网站中的分享怎么做微信管理系统
  • 怎么建设一个网站赚钱苹果被曝开发搜索引擎对标谷歌
  • 网站建设图片合肥网站推广公司哪家好
  • wordpress企业网站制作视频教程怎么开发一款app软件
  • 视频制作网站推荐网站排名优化软件哪家好
  • 网络专业的网站建设seo外链收录
  • 武汉做网站的公司网站公司的链接提交工具
  • 长沙网站建设策划如何做线上推广
  • 网站项目建设策划书流程湖南网站seo推广
  • 环保部建设项目影响登记网站上线了建站
  • 市政府网站建设标准东莞网站设计排行榜