二十、@reduxjs/toolkit
大约 3 分钟约 840 字
(一) 使用 RTK 创建 store
src/index.js
1. import ReactDOM from "react-dom/client";
import App from "./App";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);
src/App.jsx
2. import React from "react";
import "./store";
const App = () => {
return <div>App</div>;
};
export default App;
src/store/index.js
3. yarn add react-redux @reduxjs/toolkit
createSlice
创建 reducer
的切片,参数是配置对象
1)name
自动生成action
中的type
initialState
当前切片的state
的初始值reducers
指定state
的各种操作方法,不同方法对应对state
的不同操作
stuSlice.actions
切片对象会自动生成 action
2)actions
中存储的是slice
自动生成的action
创建器(函数),调用函数后会自动创建action
对象action
对象结构:{ type: 切片name/函数名, payload: 调用函数的参数 }
configureStore
用来创建 store
对象,参数是配置对象
3)import { createSlice, configureStore } from "@reduxjs/toolkit";
const stuSlice = createSlice({
name: "stu",
initialState: {
name: "孙悟空",
age: 18,
gender: "男",
address: "花果山",
},
reducers: {
// state 是state的代理对象,可以直接修改,无需浅复制原对象
setName(state, action) {
state.name = "猪八戒";
},
setAge(state, action) {
state.age = 28;
},
},
});
export const { setName, setAge } = stuSlice.actions;
// // const nameAction = setName();
// const nameAction = setName("哈哈");
// console.log(nameAction);
// 创建store
const store = configureStore({
reducer: {
student: stuSlice.reducer,
},
});
export default store;
(二) 完成 RTK 代码
src/index.js
1. import ReactDOM from "react-dom/client";
import App from "./App";
import { Provider } from "react-redux";
import store from "./store";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<Provider store={store}>
<App />
</Provider>,
);
src/App.jsx
2. import React from "react";
import { useSelector, useDispatch } from "react-redux";
import { setName, setAge } from "./store";
const App = () => {
// 加载state中的数据
const student = useSelector((state) => state.student);
// 获取派发器对象
const dispatch = useDispatch();
const setNameHandler = () => {
dispatch(setName("沙和尚"));
};
const setAgeHandler = () => {
dispatch(setAge(30));
};
return (
<div>
<p>
{student.name}---{student.age}---{student.gender}---{student.address}
</p>
<button onClick={setNameHandler}>修改name</button>
<button onClick={setAgeHandler}>修改age</button>
</div>
);
};
export default App;
src/store/index.js
3. import { createSlice, configureStore } from "@reduxjs/toolkit";
const stuSlice = createSlice({
name: "stu",
initialState: {
name: "孙悟空",
age: 18,
gender: "男",
address: "花果山",
},
reducers: {
// state 是state的代理对象,可以直接修改,无需浅复制原对象
setName(state, action) {
state.name = action.payload || "猪八戒";
},
setAge(state, action) {
state.age = action.payload || 28;
},
},
});
export const { setName, setAge } = stuSlice.actions;
// 创建store
const store = configureStore({
reducer: {
student: stuSlice.reducer,
},
});
export default store;
(三) 拆分 RTK 代码
src/App.jsx
1. import React from "react";
import { useSelector, useDispatch } from "react-redux";
import { setName as setStudentName, setAge as setStudentAge } from "./store/studentSlice";
import { setName as setSchoolName, setAddress as setSchoolAddress } from "./store/schoolSlice";
const App = () => {
// 加载state中的数据
// const student = useSelector((state) => state.student);
// const school = useSelector((state) => state.school);
const { student, school } = useSelector((state) => state);
// 获取派发器对象
const dispatch = useDispatch();
const setStudentNameHandler = () => {
dispatch(setStudentName("沙和尚"));
};
const setAgeHandler = () => {
dispatch(setStudentAge(30));
};
const setSchoolNameHandler = () => {
dispatch(setSchoolName("高老庄中小"));
};
const setSchoolAddressHandler = () => {
dispatch(setSchoolAddress("高老庄府前街19号"));
};
return (
<div>
<p>
{student.name}---{student.age}---{student.gender}---{student.address}
</p>
<button onClick={setStudentNameHandler}>修改学生姓名</button>
<button onClick={setAgeHandler}>修改学生年龄</button>
<hr />
<p>
{school.name}---{school.address}
</p>
<button onClick={setSchoolNameHandler}>修改学校名称</button>
<button onClick={setSchoolAddressHandler}>修改学校地址</button>
</div>
);
};
export default App;
src/store/index.js
2. import { configureStore } from "@reduxjs/toolkit";
import { studentReducer } from "./studentSlice";
import { schoolReducer } from "./schoolSlice";
// 创建store
const store = configureStore({
reducer: {
student: studentReducer,
school: schoolReducer,
},
});
export default store;
src/store/schoolSlice.js
3. import { createSlice } from "@reduxjs/toolkit";
// 学校信息
const schoolSlice = createSlice({
name: "school",
initialState: {
name: "花果山一小",
address: "花果山大街28号",
},
reducers: {
setName(state, action) {
state.name = action.payload;
},
setAddress(state, action) {
state.address = action.payload;
},
},
});
export const { setName, setAddress } = schoolSlice.actions;
export const { reducer: schoolReducer } = schoolSlice;
src/store/studentSlice.js
4. import { createSlice } from "@reduxjs/toolkit";
// 学生信息
const studentSlice = createSlice({
name: "stu",
initialState: {
name: "孙悟空",
age: 18,
gender: "男",
address: "花果山",
},
reducers: {
// state 是state的代理对象,可以直接修改,无需浅复制原对象
setName(state, action) {
state.name = action.payload || "猪八戒";
},
setAge(state, action) {
state.age = action.payload || 28;
},
},
});
export const { setName, setAge } = studentSlice.actions;
export const { reducer: studentReducer } = studentSlice;