当前位置:   article > 正文

Redux Toolkit(ts)的基本使用_reduxjs/toolkit使用

reduxjs/toolkit使用

npm下载

npm install @reduxjs/toolkit react-redux

在src文件夹下创建store文件夹再创建index.js,创建redux

  1. import { configureStore } from '@reduxjs/toolkit'
  2. export const store = configureStore({
  3. reducer: {},
  4. })
  5. //导出定义的类型
  6. export type RootState = ReturnType<typeof store.getState>
  7. export type AppDispatch = typeof store.dispatch

在index.tsx中通过Provider组件将App组件包裹

  1. import React from 'react';
  2. import ReactDOM from 'react-dom/client';
  3. import './index.css';
  4. import App from './App';
  5. import reportWebVitals from './reportWebVitals';
  6. //引入store和Provider
  7. import {store} from './store/index'
  8. import { Provider } from 'react-redux';
  9. const root = ReactDOM.createRoot(
  10. document.getElementById('root') as HTMLElement
  11. );
  12. root.render(
  13. <React.StrictMode>
  14. //将App包裹
  15. <Provider store={store}>
  16. <App />
  17. </Provider>
  18. </React.StrictMode>
  19. );
  20. reportWebVitals();

在store文件夹下创建slice文件夹,再创建counter.ts

  1. import { createSlice } from "@reduxjs/toolkit";
  2. import type { PayloadAction } from "@reduxjs/toolkit";
  3. // 定义state中数据的类型
  4. export interface CounterState{
  5. value:number
  6. }
  7. // 初始化state
  8. const initialState:CounterState={
  9. value:0
  10. }
  11. export const counterSlice=createSlice({
  12. name:'counter',
  13. initialState,
  14. // 在reducers对state中的数据进行处理
  15. reducers:{
  16. // 增加
  17. increment:(state)=>{
  18. state.value+=1
  19. },
  20. // 减少
  21. decrement:(state)=>{
  22. state.value-=1
  23. },
  24. // 按数量进行增加
  25. incrementByAmount:(state,action:PayloadAction<number>)=>{
  26. state.value+=action.payload
  27. }
  28. }
  29. })
  30. // 将reducers中的每个写入
  31. export const{increment,decrement,incrementByAmount}=counterSlice.actions
  32. export default counterSlice.reducer

counterSlice导入reducer函数并将其添加到我们的store中。通过在reducer参数,我们告诉store使用这个slicereducer函数来处理该状态的所有更新。

  1. import { configureStore } from '@reduxjs/toolkit'
  2. //添加了这个
  3. import counterReducer from './slice/counter'
  4. // 定义类型
  5. export type RootState = ReturnType<typeof store.getState>
  6. export type AppDispatch = typeof store.dispatch
  7. export const store = configureStore({
  8. reducer: {
  9. //添加了这个
  10. couter:counterReducer
  11. },
  12. })

在src文件夹下创建couter文件夹,创建counter.tsx文件,创建hooks组件

  1. import React,{useState} from 'react'
  2. import { RootState } from '../store'
  3. import {useSelector,useDispatch} from 'react-redux'
  4. import { increment,decrement,incrementByAmount } from '../store/slice/counter'
  5. export default function Counter() {
  6. // 查询state中的数据
  7. const count=useSelector((state:RootState)=>state.couter.value)
  8. // 派发更新reducer中的方法
  9. const dispatch=useDispatch()
  10. const [incrementAmount,setIncrementAmount]=useState('2')
  11. return (
  12. <div>
  13. <div>
  14. {/* aria-label是一个用于为元素提供描述的属性。这个描述旨在帮助屏幕阅读器用户理解该元素的目的或功能。 */}
  15. <button aria-label="增加值" onClick={()=>dispatch(increment())}>+1</button>
  16. <button aria-label="减少值" onClick={()=>dispatch(decrement())}>-1</button>
  17. <div>
  18. {/* 设置增加的大小 */}
  19. <input value={incrementAmount} onChange={e=>setIncrementAmount(e.target.value)} />
  20. <button onClick={()=>dispatch(incrementByAmount(Number(incrementAmount)|0))}>增加{incrementAmount}</button>
  21. </div>
  22. <hr />
  23. <div>{count}</div>
  24. </div>
  25. </div>
  26. )
  27. }

异步情况如下

  1. import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
  2. import type { PayloadAction } from "@reduxjs/toolkit";
  3. // 定义state中数据的类型
  4. export interface CounterState{
  5. value:number
  6. }
  7. // 初始化state
  8. const initialState:CounterState={
  9. value:0
  10. }
  11. // 异步增加
  12. export const addAmountAsync=createAsyncThunk(
  13. 'incrementAsync',
  14. async () => {
  15. // 返回一个Promise对象,Promise对象的结果类型为number
  16. const res=await new Promise<number>((resolve)=>{
  17. setTimeout(()=>{
  18. resolve(3)
  19. },3000)
  20. })
  21. return res
  22. }
  23. )
  24. export const counterSlice=createSlice({
  25. name:'counter',
  26. initialState,
  27. // 在reducers对state中的数据进行处理
  28. reducers:{
  29. // 增加
  30. increment:(state)=>{
  31. state.value+=1
  32. },
  33. // 减少
  34. decrement:(state)=>{
  35. state.value-=1
  36. },
  37. // 按数量进行增加
  38. incrementByAmount:(state,action:PayloadAction<number>)=>{
  39. state.value+=action.payload
  40. }
  41. },
  42. extraReducers:(builder)=>{
  43. builder.addCase(addAmountAsync.fulfilled,(state,{payload})=>{
  44. state.value+=payload
  45. })
  46. }
  47. })
  48. // 将reducers中的每个写入
  49. export const{increment,decrement,incrementByAmount,}=counterSlice.actions
  50. export default counterSlice.reducer
  1. import React,{useState} from 'react'
  2. import { RootState,AppDispatch } from '../store'
  3. import {useSelector,useDispatch} from 'react-redux'
  4. import { increment,decrement,incrementByAmount,addAmountAsync } from '../store/slice/counter'
  5. export default function Counter() {
  6. // 查询state中的数据
  7. const count=useSelector((state:RootState)=>state.couter.value)
  8. // 派发更新reducer中的方法
  9. const dispatch:AppDispatch=useDispatch()
  10. const [incrementAmount,setIncrementAmount]=useState('2')
  11. return (
  12. <div>
  13. <div>
  14. {/* aria-label是一个用于为元素提供描述的属性。这个描述旨在帮助屏幕阅读器用户理解该元素的目的或功能。 */}
  15. <button aria-label="增加值" onClick={()=>dispatch(increment())}>+1</button>
  16. <button aria-label="减少值" onClick={()=>dispatch(decrement())}>-1</button>
  17. <div>
  18. {/* 设置增加的大小 */}
  19. <input value={incrementAmount} onChange={e=>setIncrementAmount(e.target.value)} />
  20. <button onClick={()=>dispatch(incrementByAmount(Number(incrementAmount)|0))}>增加{incrementAmount}</button>
  21. </div>
  22. <div>
  23. <button onClick={()=>dispatch(addAmountAsync())}>异步增加等3s</button>
  24. </div>
  25. <hr />
  26. <div>{count}</div>
  27. </div>
  28. </div>
  29. )
  30. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号