赞
踩
npm下载
npm install @reduxjs/toolkit react-redux
在src文件夹下创建store文件夹再创建index.js,创建redux
- import { configureStore } from '@reduxjs/toolkit'
-
- export const store = configureStore({
- reducer: {},
- })
-
- //导出定义的类型
- export type RootState = ReturnType<typeof store.getState>
- export type AppDispatch = typeof store.dispatch
在index.tsx中通过Provider组件将App组件包裹
- import React from 'react';
- import ReactDOM from 'react-dom/client';
- import './index.css';
- import App from './App';
- import reportWebVitals from './reportWebVitals';
- //引入store和Provider
- import {store} from './store/index'
- import { Provider } from 'react-redux';
-
- const root = ReactDOM.createRoot(
- document.getElementById('root') as HTMLElement
- );
- root.render(
- <React.StrictMode>
- //将App包裹
- <Provider store={store}>
- <App />
- </Provider>
- </React.StrictMode>
- );
-
- reportWebVitals();
在store文件夹下创建slice文件夹,再创建counter.ts
- import { createSlice } from "@reduxjs/toolkit";
- import type { PayloadAction } from "@reduxjs/toolkit";
-
- // 定义state中数据的类型
- export interface CounterState{
- value:number
- }
-
- // 初始化state
- const initialState:CounterState={
- value:0
- }
-
- export const counterSlice=createSlice({
- name:'counter',
- initialState,
- // 在reducers对state中的数据进行处理
- reducers:{
- // 增加
- increment:(state)=>{
- state.value+=1
- },
- // 减少
- decrement:(state)=>{
- state.value-=1
- },
- // 按数量进行增加
- incrementByAmount:(state,action:PayloadAction<number>)=>{
- state.value+=action.payload
- }
- }
- })
-
- // 将reducers中的每个写入
- export const{increment,decrement,incrementByAmount}=counterSlice.actions
-
- export default counterSlice.reducer
-
counterSlice导入reducer函数并将其添加到我们的store中。通过在reducer
参数,我们告诉store使用这个slicereducer函数来处理该状态的所有更新。
- import { configureStore } from '@reduxjs/toolkit'
- //添加了这个
- import counterReducer from './slice/counter'
-
- // 定义类型
- export type RootState = ReturnType<typeof store.getState>
- export type AppDispatch = typeof store.dispatch
-
- export const store = configureStore({
- reducer: {
- //添加了这个
- couter:counterReducer
- },
- })
在src文件夹下创建couter文件夹,创建counter.tsx文件,创建hooks组件
- import React,{useState} from 'react'
- import { RootState } from '../store'
- import {useSelector,useDispatch} from 'react-redux'
- import { increment,decrement,incrementByAmount } from '../store/slice/counter'
-
- export default function Counter() {
- // 查询state中的数据
- const count=useSelector((state:RootState)=>state.couter.value)
- // 派发更新reducer中的方法
- const dispatch=useDispatch()
- const [incrementAmount,setIncrementAmount]=useState('2')
-
- return (
- <div>
- <div>
- {/* aria-label是一个用于为元素提供描述的属性。这个描述旨在帮助屏幕阅读器用户理解该元素的目的或功能。 */}
-
- <button aria-label="增加值" onClick={()=>dispatch(increment())}>+1</button>
- <button aria-label="减少值" onClick={()=>dispatch(decrement())}>-1</button>
- <div>
- {/* 设置增加的大小 */}
- <input value={incrementAmount} onChange={e=>setIncrementAmount(e.target.value)} />
- <button onClick={()=>dispatch(incrementByAmount(Number(incrementAmount)|0))}>增加{incrementAmount}</button>
- </div>
- <hr />
- <div>{count}</div>
- </div>
- </div>
- )
- }
异步情况如下
- import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
- import type { PayloadAction } from "@reduxjs/toolkit";
-
- // 定义state中数据的类型
- export interface CounterState{
- value:number
- }
-
- // 初始化state
- const initialState:CounterState={
- value:0
- }
-
- // 异步增加
- export const addAmountAsync=createAsyncThunk(
- 'incrementAsync',
- async () => {
- // 返回一个Promise对象,Promise对象的结果类型为number
- const res=await new Promise<number>((resolve)=>{
- setTimeout(()=>{
- resolve(3)
- },3000)
- })
- return res
- }
- )
-
- export const counterSlice=createSlice({
- name:'counter',
- initialState,
- // 在reducers对state中的数据进行处理
- reducers:{
- // 增加
- increment:(state)=>{
- state.value+=1
- },
- // 减少
- decrement:(state)=>{
- state.value-=1
- },
- // 按数量进行增加
- incrementByAmount:(state,action:PayloadAction<number>)=>{
- state.value+=action.payload
- }
- },
- extraReducers:(builder)=>{
- builder.addCase(addAmountAsync.fulfilled,(state,{payload})=>{
- state.value+=payload
- })
- }
- })
-
- // 将reducers中的每个写入
- export const{increment,decrement,incrementByAmount,}=counterSlice.actions
-
- export default counterSlice.reducer
-
- import React,{useState} from 'react'
- import { RootState,AppDispatch } from '../store'
- import {useSelector,useDispatch} from 'react-redux'
- import { increment,decrement,incrementByAmount,addAmountAsync } from '../store/slice/counter'
-
- export default function Counter() {
- // 查询state中的数据
- const count=useSelector((state:RootState)=>state.couter.value)
- // 派发更新reducer中的方法
- const dispatch:AppDispatch=useDispatch()
- const [incrementAmount,setIncrementAmount]=useState('2')
-
- return (
- <div>
- <div>
- {/* aria-label是一个用于为元素提供描述的属性。这个描述旨在帮助屏幕阅读器用户理解该元素的目的或功能。 */}
-
- <button aria-label="增加值" onClick={()=>dispatch(increment())}>+1</button>
- <button aria-label="减少值" onClick={()=>dispatch(decrement())}>-1</button>
- <div>
- {/* 设置增加的大小 */}
- <input value={incrementAmount} onChange={e=>setIncrementAmount(e.target.value)} />
- <button onClick={()=>dispatch(incrementByAmount(Number(incrementAmount)|0))}>增加{incrementAmount}</button>
- </div>
- <div>
- <button onClick={()=>dispatch(addAmountAsync())}>异步增加等3s</button>
- </div>
- <hr />
- <div>{count}</div>
- </div>
- </div>
- )
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。