@reduxjs/toolkit的基本用法一

@reduxjs/toolkit的基本用法一

道阻且长,行而不辍,未来可期

这里只讲了同步用法哦

1.安装@reduxjs/toolkit

yarn add @reduxjs/toolkit react-redux

2.创建一个slice

@reduxjs/toolkit管模块叫切片slice,slice相当于vuex中的module
在这里插入图片描述
user.ts的完整代码

import { createSlice, PayloadAction } from '@reduxjs/toolkit'

interface UserState {
  name: string;
  age: number;
}
const initialState: UserState = {
  name: '纸崩',
  age: 20
}

/**
 * 创建slice,在rtk里面叫切片,相当于vuex里面的模块
 * 使用createSlice方法创建一个slice。每一个slice里面包含了reduce和actions
 * 可以实现模块化的封装。so,与user相关的操作都在该slice(切片)中完成
 */
export const userSlice = createSlice({
  name: 'user',//命名空间,可以自动把每一个action进行独立,解决了action的type出现同名的文件,在使用的时候会默认使用name/actionName
  initialState,//state数据的初始值

  //reducers里面包裹的是同步方法
  reducers: {
    //定义的action,由于内置了immutable插件,可以直接使用赋值的方式进行数据的改变,
    //不需要每一次都返回一个新的state数据
    setName(state, action: PayloadAction<string>) {
      //第一个参数 state 为当前state中的数据
      //第二个参数action为{payload,type:'user/setName'}
      //payload 为传过来的新参数
      // type 为action触发的类型
      state.name = action.payload
    },
    setAge(state, action: PayloadAction<number>) {
      state.age = action.payload
    }
  }
})

// 导出actions
export const { setName, setAge } = userSlice.actions;

3.挂载slice

在这里插入图片描述
index.ts的完整代码:

import { configureStore } from '@reduxjs/toolkit'
import { userSlice } from './slices/user';


//configureStore挂载每一个modules
const store = configureStore({
  reducer: {
    user: userSlice.reducer//user module
  },
  devTools: true
})

//定义 ts types
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;


//导出store
export default store;

4.挂载store到根节点

import { Provider } from 'react-redux';
//引入store
import store from './store/index';

const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);
root.render(
  <React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>
);

5.在组件中使用user slice中的state的数据,以及reducers中包裹的同步方法

(https://img-blog.csdnimg.cn/bbdb5c0e99e24af7a9f85b3961a2bf8d.png)
Home.tsx的完整代码:

//在组件内部,使用useState和useDispatch可以直接获取state数据与dispatch方法
import { useSelector, useDispatch } from 'react-redux';
import { RootState } from '../store';
//引入action
import { setName, setAge } from '../store/slices/user';

const person = {
  name: 'aa',
  age: 19
}
export function Home() {
  //5.获取user切片,使用user中的state中的数据:user.name
  //这里的useSelector 结构出来的 user是切片的命名空间的名字,不是随便写的
  const { user } = useSelector((state: RootState) => state);
  const dispatch = useDispatch();

 //6.使用user slice中定义的同步方法
  return (
    <div>
      <p>{user.name}</p>
      <button onClick={() => dispatch(setName("山海"))}>设置name</button>
    </div>
  )
}

6.运行结果

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值