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

政府行业网站建设方案重庆店铺整站优化

政府行业网站建设方案,重庆店铺整站优化,南通城乡住房建设厅网站,琴行网站建设方案有同学反馈开发 ReactNative 应用时状态管理不是很明白,接下来几篇文章我们来对比下 React 及 ReactNative 状态管理常用的几种框架的使用和优缺点。 上一篇文章介绍了 redux 的使用,这篇文章我们来看下 redux 的升级版:redux-toolkit。 下…

有同学反馈开发 ReactNative 应用时状态管理不是很明白,接下来几篇文章我们来对比下 React 及 ReactNative 状态管理常用的几种框架的使用和优缺点。

上一篇文章介绍了 redux 的使用,这篇文章我们来看下 redux 的升级版:redux-toolkit。

下面是使用 React 和 Redux-Toolkit 创建一个简单的 Todo List App 的代码示例,完整代码见文章末尾:

  1. 首先,在命令行中输入以下命令新建一个React应用:
npx create-react-app todolist
  1. 安装 Redux-Toolkit 和 React-Redux:
npm install @reduxjs/toolkit react-redux
  1. 创建一个 todoSlice.ts 文件,在其中完成 action 和 reducer的创建「非常重要,需要保证理解」
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { State, TODO } from "../module/todo";const initState : State = {todos: [{text: "zsx clean room"}]
};//1.创建 Slice,每个业务一个 分片
const todoSlice = createSlice({name: 'todo',   // 这个名称似乎没啥用initialState: initState,//最重要的 reducers 属性,包括多个函数reducers: {addTodo: (state: State, action: PayloadAction<string>) => {return {todos: [...state.todos, {text: action.payload}]};},deleteTodo: (state: State, action: PayloadAction<string>) => {state.todos = state.todos.filter((item: TODO, index: number)=> {return item.text !== action.payload});}}
})//2.导出 slice 的 action 和 reducer
export const {addTodo, deleteTodo} = todoSlice.actions;
export default todoSlice.reducer;

在上面的代码里,我们使用 redux-toolkit 的 createSlice 创建了一个分片,分片代表某个业务的数据状态处理,比如 todoSlice 就代表 todo 业务的所有状态处理。

createSlice 的参数,分别包括 name(名称,似乎没啥用)、initialState(项目初始状态)和 reducers,

其中 reducers 是最重要的,它就是一个对象:

    reducers: {addTodo: (...) => {//...},deleteTodo: (...) => {//...}}

对象的成员就是支持的 action 函数,比如添加 todo:

        addTodo: (state: State, action: PayloadAction<string>) => {//可以直接修改数据// state.todos.push({//     text: action.payload// })//也可以返回新的return {todos: [...state.todos, {text: action.payload}]};}

可以看到,上面的 addTodo 类似 redux 中的 reducer,不同的在于,createSlice 中不再需要根据 action type 进行 switch case 匹配,而是直接提供了函数,以执行状态。

需要注意的是,toolkit 中的 reducer 函数,可以修改原始状态(redux 本身是需要返回新状态的),这是因为它内部的特殊实现。

  1. 通过 createSlice 创建完 todoSlice 后,下一步就是导出其中的 action 和 reducer
export const {addTodo, deleteTodo} = todoSlice.actions;
export default todoSlice.reducer;

这里再次证明,slice 是 action 和 reducer 的封装,redux-toolkit 通过 slice 把 action 和 reducer 封装到了一起,不再需要单独创建 action 和 action creator。

通过 redux-toolkit,我们创建完 slice,就可以通过 slice 的 action 和 reducer 进行使用。

  1. 创建 store:
import { configureStore } from "@reduxjs/toolkit";
import todoReducer from "./todoSlice";//3.配置 store,创建全局唯一的 stroe
const store = configureStore({//多个 reducer,访问数据时也需要通过多层获取//这里的名称,决定了获取数据时,需要访问的对象名称reducer: {todo: todoReducer}
});export default store;

和 redux 不同,redux-toolkit 使用 configureStore 创建 store,它的好处是当有多个 reducer 时更简单。

只需要在参数里提供一个 reducer 对象即可,有多少个业务,就给这个对象增加几个成员。

{//多个 reducer,访问数据时也需要通过多层获取//这里的名称,决定了获取数据时,需要访问的对象名称reducer: {todo: todoReducer,other: otherReducer}
}

最终业务在访问自己的数据时,通过 对象名称可以获取到数据。

  1. 上层组件通过 Provider 分发给组件树:
const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement
);//分发给子元素
root.render(<Provider store={store}><ToolkitTodoApp/></Provider>
);

这一点和 redux 一样,都是使用 react-redux 的 Provider 提供给子组件,参数就是上一步创建的 store。

ToolkitTodoApp 是下一步要创建的 UI 组件

  1. 最后一步,业务组件中通过 useSelector 和 useDispatch 获取数据和分发行为:
import {useState} from "react";
import { useDispatch, useSelector } from "react-redux";
import { State, TODO } from "../module/todo";
import store from "./store";
import { addTodo, deleteTodo } from "./todoSlice";
type RootState = ReturnType<typeof store.getState>;//业务通过 useSelector 获取数据;通过 useDispatch 分发
//比如使用 connect,更简单易懂
const ToolkitTodoApp = () => {//获取到的是全局的 State,需要通过 reducer 的名称获取到当前需要的状态const todos = useSelector((state: RootState) => {return state.todo.todos;});const dispatch = useDispatch();const [text, setText] = useState('');const handleInput = (e: any) => {setText(e.target.value)}const handleAddTodo = () => {//todoSlice 导出的 action, 参数就是 action.payload 的类型dispatch(addTodo(text))setText('')}const handleDeleteTodo = (text: string) => {dispatch(deleteTodo(text))}return (<div style={{display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center'}}><h1>This Is Redux-Toolkit TODO App.</h1><ul>{todos && todos.map((todo: TODO, index: any) => {return (<li key={index}><span>{todo.text}</span><button style={{marginLeft: '12px'}} onClick={() => handleDeleteTodo(todo.text)}>finish</button></li>)})}</ul><div style={{display: 'flex', flexDirection: 'row'}}><input value={text} onChange={handleInput}/><button onClick={handleAddTodo}>Add Todo</button></div></div>)
}export default ToolkitTodoApp;

从上面的代码中可以看到,使用 redux-toolkit,组件里获取状态也更简单了,不再需要写 connect、mapStateToProps 和 mapDispatchToProps,只需要通过 react-redux 提供的 useSelector hook 即可:

    const todos = useSelector((state: RootState) => {return state.todo.todos;});

需要注意的是:useSelector 里筛选自己需要的数据时,需要通过 reducer 的名称获取到当前需要的状态,否则会出现字段取不到或者取错的情况。

比如上面的例子里,配置 store 时,todo 的 reducer 的名称叫 “todo”,那在 todo 业务里,通过useSelector 里获取它 state 时,就需要通过这个名称 “todo” 去拿字段:

const store = configureStore({//多个 reducer,访问数据时也需要通过多层获取//这里的名称,决定了获取数据时,需要访问的对象名称reducer: {todo: todoReducer}
});
state.todo.todos;

我一开始使用 redux-toolkit 的时候,就在这一步遇到了问题。

另外,使用 useDispatch 分发行为时也需要注意:传递的参数是 createSlice 后导出的 action,参数类型需要和 这个 action 的 payload 类型一样。

比如前面的 todoSlice 的 reducers 里,addTodo 的 action 类型是 PayloadAction:

addTodo: (state: State, action: PayloadAction<string>) => {...}

那在调用这个 action 时,就需要传递 string 类型的参数:

    const handleAddTodo = () => {//todoSlice 导出的 action, 参数就是 action.payload 的类型dispatch(addTodo(text))setText('')}

总结一下,通过 redux-toolkit 管理状态分这几步:

  1. 通过 createSlice 创建 slice,在其中指定初始状态和支持的 action reducer

  2. 导出 slice 的 actions 和 reducer

  3. 通过 configureStore 创建 store,参数是一个对象,包括上一步导出的 reducer

    1. 需要指定好业务名称,后续取数据要用
  4. 通过 Provider 分发给组件树

  5. 业务组件中通过 useSelector 和 useDispatch 获取数据和分发行为

可以看到,redux-toolkit 与 redux 相比,不需要创建 action creator 和 connect,简化了开发步骤。

完整代码:https://github.com/shixinzhang/redux-sample/tree/main/src/redux-toolkit

http://www.tj-hxxt.cn/news/33622.html

相关文章:

  • 武汉刚刚突然宣布2022快速优化seo软件推广方法
  • 网站建设中 请稍后访问客户推广渠道有哪些
  • 如何设计网站logo河南郑州最新消息今天
  • 网站架构分析做广告的怎么找客户
  • 建建建设网站首页常用的网络推广方式有哪些
  • 通用网址查询网站全网营销推广怎么做
  • 做包装一般看什么网站百度指数的数据来源
  • 如何扫描网站漏洞无锡谷歌优化
  • 国外做饰品批发网站2021年十大热点事件
  • 免费发布信息网站网址大全互联网广告推广公司
  • 网站的客服怎么做百度关键词推广费用
  • 软件工程师招聘简章pdf什么是seo营销
  • 手机端官网设计seo诊断报告怎么写
  • 湛江专业舞台制作seo搜索优化工具
  • 嘉兴有哪些做网站的公司在哪里做推广效果好
  • 网站怎么做导航百度一下你就知道官网下载安装
  • 通过域名打开网站是做映射么如何制作一个网址
  • 成都建设网站专业产品推广平台排行榜
  • 上海网站建设与设计公司好重庆店铺整站优化
  • 做设计在哪个网站上找高清图江西网络推广seo
  • 网站上facebook怎么做链接竞价排名什么意思
  • 怎么修复网站死链中文域名交易网站
  • 商城系统平台模板汕头自动seo
  • 网站建设成本图seo下拉优化
  • 学校的网站怎么做的好全球热搜榜排名今日
  • 模板网站怎么做卖b2b免费网站推广平台
  • 网站建设与维护专业实训室全文搜索引擎有哪些
  • 做网站哪些比较好百度网址安全检测中心
  • 杭州做网站价格迈步者seo
  • 关于织金县网站建设的论文青海网站seo