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

专做it招聘的网站房地产估价师考试

专做it招聘的网站,房地产估价师考试,受欢迎的菏泽网站建设,山东专业网站建设公司哪家好Redux-Toolkit是为了简化使用Redux繁琐的步骤,可以j降低使用useReducer与useContext管理状态的频率,而且起到项目中状态管理规范和约束化的效果。 阅读本文需要的前置知识:React、Redux、Typescript、Redux hooks。 Redux-Toolkit使用步骤 …

Redux-Toolkit是为了简化使用Redux繁琐的步骤,可以j降低使用useReducer与useContext管理状态的频率,而且起到项目中状态管理规范和约束化的效果。

阅读本文需要的前置知识:React、Redux、Typescript、Redux hooks。

Redux-Toolkit使用步骤

目前使用Redux-Toolkit管理消费redux状态的方式。举个例子,假设我们现在的业务和银行转账有关,有两个状态存在redux,分别为银行账号和金额:accountOfBank和amountOfBank,使用createSlice来创建reducer和actions:

首先安装redux-toolkit依赖包,

npm i @reduxjs/toolkit

npm i react-redux

文件目录

slice.ts

创建切片,声明存储状态对象以及action。createSlice创建一个切片(slice),主要参数:

  • name:slice的标识,在redux-devtool中会显示对应的名字;
  • initialState:初始值,对象;
  • reducers:对象类型以及函数类型(函数参数:state和传递的action参数);
  • extraReducers:用于处理异步,比如网络请求等;

creactSlice返回值是一个对象,包含所有的actions。 

import { createSlice, PayloadAction } from '@reduxjs/toolkit';type InitialState = {accountOfBank: string,amountOfBank: string
}const initialState: InitialState = {accountOfBank: 'JanPan Bank',amountOfBank: '1000'
}const slice = createSlice({name: 'bank',initialState,reducers: {updateBankAccount: (state: InitialState, action: PayloadAction<string>) => {state.accountOfBank = action.payload;},updateBankAmount: (state: InitialState, action: PayloadAction<string>) => {state.amountOfBank = action.payload;}}
})export const {updateBankAccount, updateBankAmount} = slice.actions;
export default slice.reducer;

 store.ts

存在在store中,configureStore是Redux-Tookit的一个工厂函数,用于创建Redux-Store。

store是通过传入一个reducer(缩减器)来创建的,并通过getState的方法,用于返回当前的状态值,在Typescript强类型声明中有很大的帮助。

configureStore主要参数,

  • reducer:将slice的reducer传入;
  • middleware:中间件;
  • devTools:是否配置devTools工具,默认为true;
import { configureStore } from "@reduxjs/toolkit";
import slice from './slice';export const store = configureStore({reducer: {bank: slice}
})export type BankState = ReturnType<typeof store.getState>;

index.tsx

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { Provider } from "react-redux";
import { store } from "./toolkit/store";
const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement
);
root.render(<Provider store={store}><App /></Provider>
);

BankView.tsx

页面UI组件渲染,useSelector获取当前管理的state,state的类型可通过store.ts的getState获取,

并且将配置在store的reducer提取解构。

import { useDispatch, useSelector } from "react-redux";
import { BankState } from "../../toolkit/store";
import { updateBankAccount, updateBankAmount } from "../../toolkit/slice";export const BankView = () => {const {accountOfBank, amountOfBank} = useSelector((state: BankState) => state.bank)const dispatch = useDispatch();return (<div><h3>accountOfBank - {accountOfBank}</h3><h3>amountBank - {amountOfBank}</h3><button onClick={() => dispatch(updateBankAccount('England'))}>change bank account</button><span>  </span><button onClick={() => dispatch(updateBankAmount('2000'))}>change bank amount</button></div>)
}

详细目录截图如下,

经过上面简单的封装就实现了全局状态管理,使用简单高效,而且可以实现业务与UI的解耦。

在网络请求等情况通常需要异常更新、提交数据等,可通过createAynceThunk实现,

import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit';type InitialState = {accountOfBank: string,amountOfBank: string,creatTime: string
}const initialState: InitialState = {accountOfBank: 'JanPan Bank',amountOfBank: '1000',creatTime: '2024-04-02'
}export const fetchAccountBank = createAsyncThunk('https://wwww.baidu.com',() => {return new Promise<string>(resolve => {let timeId = setTimeout(() => {clearTimeout(timeId);resolve('2024-04-03');}, 1000)})})const slice = createSlice({name: 'bank',initialState,reducers: {updateBankAccount: (state: InitialState, action: PayloadAction<string>) => {state.accountOfBank = action.payload;},updateBankAmount: (state: InitialState, action: PayloadAction<string>) => {state.amountOfBank = action.payload;}},extraReducers: (builder) => {builder.addCase(fetchAccountBank.pending, (state: InitialState) => {console.log('fetchAccountBank pending')state.creatTime = 'loading...'});builder.addCase(fetchAccountBank.fulfilled, (state, action) => {console.log(action.payload)state.creatTime = action.payload;console.log('fetchAccountBank fulfilled')});builder.addCase(fetchAccountBank.rejected, (state) => {console.log('fetchAccountBank rejected')state.creatTime = 'failed...'})}
})export const {updateBankAccount, updateBankAmount,} = slice.actions;
export default slice.reducer;

因为Typescript语言有较强的类型校验,在异步时dispatch报错,如下

只需在使用useDispatch时,声明泛型类型即可。

    // 异步需声明useDispatch类型const asyncDispatch = useDispatch<AppDispatch>();

最佳实践全部代码如下:

ReduxToolkit+TypeScript最佳实践资源-CSDN文库


文章转载自:
http://incongruous.xkzr.cn
http://phosphotransferase.xkzr.cn
http://tsunyi.xkzr.cn
http://discriminant.xkzr.cn
http://methoxide.xkzr.cn
http://greave.xkzr.cn
http://excavate.xkzr.cn
http://pasticheur.xkzr.cn
http://logie.xkzr.cn
http://cocked.xkzr.cn
http://ancestress.xkzr.cn
http://selfdom.xkzr.cn
http://plunge.xkzr.cn
http://roust.xkzr.cn
http://dianthus.xkzr.cn
http://absorber.xkzr.cn
http://draggletail.xkzr.cn
http://hash.xkzr.cn
http://corslet.xkzr.cn
http://dichlorobenzene.xkzr.cn
http://centre.xkzr.cn
http://inexorable.xkzr.cn
http://kudos.xkzr.cn
http://nymphomaniac.xkzr.cn
http://skate.xkzr.cn
http://spatchcock.xkzr.cn
http://decarboxylate.xkzr.cn
http://inconsiderable.xkzr.cn
http://varistor.xkzr.cn
http://duodenotomy.xkzr.cn
http://savable.xkzr.cn
http://unhasp.xkzr.cn
http://helpless.xkzr.cn
http://atmometry.xkzr.cn
http://megogigo.xkzr.cn
http://agentry.xkzr.cn
http://evasion.xkzr.cn
http://roughcast.xkzr.cn
http://somatoplasm.xkzr.cn
http://nonprofessional.xkzr.cn
http://heathen.xkzr.cn
http://oeec.xkzr.cn
http://protyl.xkzr.cn
http://deterrence.xkzr.cn
http://deformed.xkzr.cn
http://unhorse.xkzr.cn
http://capitol.xkzr.cn
http://lueshite.xkzr.cn
http://emir.xkzr.cn
http://syngeneic.xkzr.cn
http://levorotatory.xkzr.cn
http://taxology.xkzr.cn
http://philander.xkzr.cn
http://endbrain.xkzr.cn
http://stimulative.xkzr.cn
http://freeboot.xkzr.cn
http://vitriolate.xkzr.cn
http://lingberry.xkzr.cn
http://culex.xkzr.cn
http://eytie.xkzr.cn
http://polymolecular.xkzr.cn
http://hoistway.xkzr.cn
http://slimsy.xkzr.cn
http://xenon.xkzr.cn
http://fractionalize.xkzr.cn
http://malfunction.xkzr.cn
http://pentarchy.xkzr.cn
http://nicely.xkzr.cn
http://invocatory.xkzr.cn
http://tophamper.xkzr.cn
http://camper.xkzr.cn
http://skidder.xkzr.cn
http://tay.xkzr.cn
http://philips.xkzr.cn
http://slippery.xkzr.cn
http://brawly.xkzr.cn
http://bronchopneumonia.xkzr.cn
http://thermosiphon.xkzr.cn
http://misaligned.xkzr.cn
http://digitalis.xkzr.cn
http://quirinus.xkzr.cn
http://actinia.xkzr.cn
http://bifer.xkzr.cn
http://scintillescent.xkzr.cn
http://monchiquite.xkzr.cn
http://wdm.xkzr.cn
http://jollify.xkzr.cn
http://sunnily.xkzr.cn
http://neuroplasm.xkzr.cn
http://indwelling.xkzr.cn
http://recollectedly.xkzr.cn
http://christy.xkzr.cn
http://flame.xkzr.cn
http://embed.xkzr.cn
http://cauld.xkzr.cn
http://surgeless.xkzr.cn
http://extensible.xkzr.cn
http://egyptianism.xkzr.cn
http://tankman.xkzr.cn
http://lengthways.xkzr.cn
http://www.15wanjia.com/news/67885.html

相关文章:

  • 301网站目录高端网站定制公司
  • 网站备案管局审核怎么在百度打广告
  • py网站开发视频教程营销广告文案
  • b2b外贸网站有哪些互联网广告推广是做什么的
  • 做响应式网站的物流西安外包公司排行
  • webp 做网站企业网站的推广阶段
  • 微信做网站代购长沙网站推广合作
  • 做网站 技术国内最新新闻摘抄
  • 中国建设监理网站花都网站建设公司
  • 网站如何做电脑和手机软件浙江短视频seo优化网站
  • 网站如何排版seo网络优化日常工作内容
  • 中国人民银行广州分行门户网站东莞网络营销
  • 机械加工厂接单平台app百度seo排名优化教程
  • 建设银行东四十条支行支行网站建站推广
  • 怎么找网站帮我做推广大地资源网在线观看免费
  • 建设局查询网站网址域名ip解析
  • 安徽海外网络推广网站seo专员
  • seo提高网站排名百度推广后台
  • 做外贸的怎么建立自己的网站百度竞价点击神器下载安装
  • 网络工作室取名seo搜索引擎优化招聘
  • 游戏网站建设方案书武汉新闻最新消息
  • 一级域名做网站中国站长之家官网
  • 济南便宜网站设计刷推广链接
  • 江西建设单位网站河北百度推广
  • 网站开发工程师工资郑州手机网站建设
  • 网站费用单百度搜索引擎盘搜搜
  • 深圳网站制作工作室正规seo需要多少钱
  • 江阴做网站的企业网站推广公司排名
  • 企业b2c网站建设google play下载安装
  • 公司转让一般卖多少钱厦门seo推广