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

建站设计做英文网站用目录还是子域名

建站设计,做英文网站用目录还是子域名,珠海网络营销网站建设,深圳网站建设易佰讯Immer 是一个 immutable 库,核心实现是利用 ES6 的 proxy,几乎以最小的成本实现了 js 的不可变数据结构,简单易用、体量小巧、设计巧妙,满足了我们对JS不可变数据结构的需求。 无奈网络上完善的文档实在太少,所以自己写…

Immer 是一个 immutable 库,核心实现是利用 ES6 的 proxy,几乎以最小的成本实现了 js 的不可变数据结构,简单易用、体量小巧、设计巧妙,满足了我们对JS不可变数据结构的需求。
无奈网络上完善的文档实在太少,所以自己写了一份,本篇文章以贴近实战的思路和流程,对 Immer 进行了全面的讲解。

Immer 可以在需要使用不可变数据结构的任何上下文中使用。例如与 React state、React 或 Redux reducers 或者 configuration management 结合使用。不可变的数据结构允许(高效)的变化检测:如果对对象的引用没有改变,那么对象本身也没有改变。此外,它使克隆对象相对便宜:数据树的未更改部分不需要复制,并且在内存中与相同状态的旧版本共享

一般来说,这些好处可以通过确保您永远不会更改对象、数组或映射的任何属性来实现,而是始终创建一个更改后的副本。在实践中,这可能会导致代码编写起来非常麻烦,并且很容易意外违反这些约束。 Immer 将通过解决以下痛点来帮助您遵循不可变数据范式:

  1. Immer 将检测到意外 mutations 并抛出错误。
  2. Immer 将不再需要创建对不可变对象进行深度更新时所需的典型样板代码:如果没有 Immer,则需要在每个级别手动制作对象副本。通常通过使用大量 ... 展开操作。使用 Immer 时,会对 draft 对象进行更改,该对象会记录更改并负责创建必要的副本,而不会影响原始对象。
  3. 使用 Immer 时,您无需学习专用 API 或数据结构即可从范例中受益。使用 Immer,您将使用纯 JavaScript 数据结构,并使用众所周知的安全地可变 JavaScript API。

useState + Immer

useState hook 假定存储在其中的任何 state 都被视为不可变的。使用 Immer 可以大大简化 React 组件状态的深度更新。

import { useCallback, useState } from 'react';
import { produce } from 'immer';const TodoList = () => {const [todos, setTodos] = useState([{id: 'React',title: 'Learn React',done: true},{id: 'Immer',title: 'Try Immer',done: false}]);const handleToggle = useCallback((id: any) => {setTodos(produce((draft) => {const todo: any = draft.find((todo) => todo.id === id);todo.done = !todo?.done}));}, []);const handleAdd = useCallback(() => {setTodos(produce((draft) => {draft.push({id: 'todo_' + Math.random(),title: 'a new todo',done: false})}));}, [])return (<div><button onClick={handleAdd}>新增</button><div className="list-c">{todos.map(item => {return (<ul key={item.id} className={item.done ? 'done' : ''}><li>{item.id}</li><li>{item.title}</li><li style={{color: 'blue', paddingLeft: '20px', cursor: 'pointer'}} onClick={()=>handleToggle(item.id)}>change done</li></ul>)})}</div></div>)
}export default TodoList;

useImmer

可以省掉 produce 包装的更新模式。

import { useCallback } from 'react';
import { useImmer } from 'use-immer';const TodoList = () => {const [todos, setTodos] = useImmer([{id: 'React2',title: 'Learn React 2',done: true},{id: 'Immer2',title: 'Try Immer 2',done: false}]);const handleToggle = useCallback((id: any) => {setTodos((draft) => {const todo: any = draft.find((todo) => todo.id === id);todo.done = !todo.done;})}, [])const handleAdd = useCallback(() => {setTodos((draft) => {draft.push({id: 'todo2_' + Math.random(),title: 'A new todo 2',done: false})})}, [])return (<div><button onClick={handleAdd}>新增</button><div className="list-c">{todos.map(item => {return (<ul key={item.id} className={item.done ? 'done' : ''}><li>{item.id}</li><li>{item.title}</li><li style={{color: 'blue', paddingLeft: '20px', cursor: 'pointer'}} onClick={()=>handleToggle(item.id)}>change done</li></ul>)})}</div></div>)
}export default TodoList;

useReducer + Immer

与 useState 类似,需要使用 produce 包装的更新模式,useReducer 也与 Immer 巧妙结合

import { useCallback, useReducer } from 'react';
import { produce } from 'immer';const TodoList = () => {const [todos, dispatch] = useReducer(produce((draft, action) => {switch (action.type) {case 'toggle':const todo: any = draft.find(todo => todo.id === action.id);todo.done = !todo.done;break;case 'add':draft.push({id: action.id,title: 'A new todo 3',done: false})break;default:break;}}),[{id: 'React3',title: 'Learn React 3',done: true},{id: 'Immer3',title: 'Try Immer3',done: false}])const handleToggle = useCallback((id) => {dispatch({type: 'toggle',id: id})}, [])const handleAdd = useCallback(() => {dispatch({type: 'add',id: 'todo3_' + Math.random()})}, [])return (<div><button onClick={handleAdd}>新增</button><div className="list-c">{todos.map(item => {return (<ul key={item.id} className={item.done ? 'done' : ''}><li>{item.id}</li><li>{item.title}</li><li style={{color: 'blue', paddingLeft: '20px', cursor: 'pointer'}} onClick={()=>handleToggle(item.id)}>change done</li></ul>)})}</div></div>)
}export default TodoList;

useImmerReducer

useImmerReducer Reducer方式省去 produce 包装的更新模式。

import { useCallback } from 'react';
import { useImmerReducer } from 'use-immer';const TodoList = () => {const [todos, dispatch] = useImmerReducer((draft, action: any) => {switch (action.type) {case 'toggle':const todo = draft.find((todo) => todo.id === action.id);todo.done = !todo.done;break;case 'add':draft.push({id: action.id,title: 'A new todo 4',done: false})break;case default:break;}},[{id: 'React4',title: 'Learn React 4',done: true},{id: 'Immer4',title: 'Try Immer4',done: false}]);const handleToggle = useCallback((id) => {dispatch({type: 'toggle',id})}, []);const handleAdd = useCallback(() => {dispatch({type: 'add',id: 'todo4_' + Math.random()})}, []);return (<div><button onClick={handleAdd}>新增</button><div className="list-c">{todos.map(item => {return (<ul key={item.id} className={item.done ? 'done' : ''}><li>{item.id}</li><li>{item.title}</li><li style={{color: 'blue', paddingLeft: '20px', cursor: 'pointer'}} onClick={()=>handleToggle(item.id)}>change done</li></ul>)})}</div></div>)
}export default TodoList;

React构建万亿级应用的工业级框架 - 高质量源码分享平台-免费下载各类网站源码与模板及前沿技术分享

http://www.dtcms.com/a/602894.html

相关文章:

  • 网站建设谈客户说什么龙岩兼职招聘最新发布
  • 上海网站建设服务多少钱广西 网站建设
  • 铜仁市城乡住房与建设局网站陕西省两学一做网站
  • 网站商城建设公司网站开发实用技术 代码
  • 外贸网站seo推广教程游戏租号网站开发
  • AI推广公司如何借助人工智能技术提升企业品牌影响力与精准流量
  • Trae,Cursor,Lingma的区别
  • 网站加ico苏州集团网站设计公司
  • 汕头论坛网站建设如何建设网站pdf
  • 有关网站备案号规则四川省建设网站评标专家考试
  • 【调用大厂商模型构建私有知识库RAG】安全性、成本、存储、合规性
  • 国外平面设计欣赏网站专业的建设企业网站
  • 石材网站模板长春app定制
  • 天河网站建设哪个好wordpress 4.8 pdf缩略图
  • 网上发布信息的网站怎么做的软文营销公司
  • WordPress站点添加ssl证书网站图片命名规范
  • 广州网站制作开发建设网站需申请什么手续
  • [AI tradingOS] 认证与用户管理 | 2FA | TOTP | JWT
  • C语言编译时不检查语法正确性 | 如何通过编译器解决语法检查问题
  • 上海网站关键词排名优化报价北京做网站需要多少钱
  • 找高权重的网站做外链网页制作实践 做网站
  • 网站域名怎么写好动漫制作专业可以专升本吗
  • 石家庄专业建站公司怎么做网站卖车
  • 网站后台传不了图片网站制作成本包含
  • 如何安全配置Linux服务器【完整指南】
  • 娱乐网站名字有专业做网站的学校吗
  • 我想卖东西去哪个网站合肥网站建设 合肥网络推广
  • 易语言黑月编译器 | 提升开发效率的智能编程工具
  • 中国建设银行手机银行下载官方网站深圳建设工程交易中心主页
  • Go 语言结构体