Skip to content

Redux(第一种方案)

安装

bash
npm i  react-redux @reduxjs/toolkit -S

4 步法则

(1) 创建切片

根目录下创建 store 文件夹,里面创建一个 index.js 文件,用来创建 store

在 store 文件夹下面创建 modules 文件夹,里面创建一个 user.js 文件,用来创建切片

ts
import { createSlice } from "@reduxjs/toolkit";

const user = createSlice({
  name: "userslice",
  initialState: {
    name: "张三",
    age: 20,
    detail: {
      sex: "男",
      height: 180,
    },
  },
  reducers: {
    setAge: (state, { payload }) => {
      const result = { ...state };
      result.age += payload;
      console.log(result);
      return result;
    },
    setName: (state, { payload }) => {
      const result = { ...state };
      result.name = payload;
      return result;
    },
    setSex: (state, { payload }) => {
      const result = JSON.parse(JSON.stringify(state));
      console.log(result);
      result.detail.sex = payload;
      console.log(result);
      return result;
    },
    setHeight: (state, { payload }) => {
      const result = JSON.parse(JSON.stringify(state));
      result.detail.height = payload;
      return result;
    },
  },
});

export const { setAge, setName, setSex, setHeight } = user.actions;
export default user.reducer;
  • 在 modules 文件夹,里面创建一个 goods.js 文件,用来创建切片
ts
import { createSlice } from "@reduxjs/toolkit";

const Goods = createSlice({
  name: "Goods",
  initialState: {
    goodsname: "宝莲灯",
    goodssale: "1000",
  },
  reducers: {
    setGoodsName: (state, { payload }) => {
      const result = { ...state };
      result.goodsname = payload;
      return result;
    },
    setGoodssale: (state, { payload }) => {
      const result = { ...state };
      result.goodssale = payload;
      return result;
    },
  },
});

export const { setGoodsName, setGoodssale } = Goods.actions;
export default Goods.reducer;

(2) 创建 store

根目录下创建 store 文件夹,里面创建一个 index.js 文件,用来创建 store

引入模块

ts
import { configureStore } from "@reduxjs/toolkit";
import userSlice from "./user";
import goodsSlice from "./goods";
const Store = configureStore({
  reducer: {
    user: userSlice,
    goods: goodsSlice,
  },
});

export default Store;

(3) 根组件使用

  • main.jsx
jsx
import { Provider } from "react-redux";
import store from "./store/index.js";
<React>
  <Provider store={store}>
    <App />
  </Provider>
</React>;

(4) 组件使用

  • 基础版
jsx
import {useSelector,useDispatch} from "react-redux"
 const Child = ()=>{
const user = useSelector((state)=>state.user)
const dispatch = useDispatch()
    return (
          <div>
               <h1>组件--{JSON.stringnify(user)}</h1>
                 <button onClick={()=>dispatch({type:"user-slice/setName",payload:1})}>改变年龄 </button>
        </div>
     )
 }
  • 优雅的写法
jsx
import { useSelector, useDispatch } from "react-redux";

import { setAge, setName, setSex, setHeight } from "../store/modules/user";

function Base() {
  const user = useSelector((state) => state.user);
  const dispatch = useDispatch();
  return (
    <div>
      <span>{user.name}</span>
      <span>{user.age}</span>
      <span>{user.detail.sex}</span>
      <span>{user.detail.height}</span>
      <button onClick={() => dispatch(setName("李四"))}>点击改变名字</button>
      <button onClick={() => dispatch(setAge(1))}>点击改变年龄</button>
      <button onClick={() => dispatch(setSex("女"))}>点击改变性别</button>
      <button onClick={() => dispatch(setHeight(210))}>点击改变身高</button>
    </div>
  );
}

export default Base;