web前端全系列 教程
1839个小节阅读:2243.7k
鸿蒙应用开发
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
slice是应用中单个功能的 Redux reducer 逻辑和 action 的集合, 通过slice我们可以把某个功能的对应state,action,reducer一起定义在一个文件中。
xxxxxxxxxx
//app/store.js
import { configureStore } from '@reduxjs/toolkit';
import counterReducer from '../features/counter/counterSlice';
import userReducer from '../features/user/userSlice';
//调用@reduxjs/toolkit工具库里面的configureStore方法来创建应用的Store
export const store = configureStore({
reducer: {
//counterReducer就是一个slice
counter: counterReducer,
//userReducer也是一个slice
user:userReducer
},
});
src/features/counter/counterSlice.js
xxxxxxxxxx
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import { fetchCount } from './counterAPI';
//定义初始state
const initialState = {
value: 0,
status: 'idle',
};
export const counterSlice = createSlice({
//name用来设置当前这个slice的区域名字
name: 'counter',
//传递初始state
initialState,
reducers: {
increment: (state) => {
// Redux Toolkit 允许我们在 reducers 写 "可变" 逻辑。
// 并不是真正的改变 state 因为它使用了 immer 库
// 当 immer 检测到 "draft state" 改变时,会基于这些改变去创建一个新的
// 不可变的 state
state.value += 1;
//不需要return 更新后的state了
},
decrement: (state) => {
state.value -= 1;
},
// reducer函数接收参数state,action
incrementByAmount: (state, action) => {
state.value += action.payload;
},
}
});
//导出action creator
export const { increment, decrement, incrementByAmount } = counterSlice.actions;
//console.log(increment())//{type:"counter/increment",payload:undefined}
//导出reducer
export default counterSlice.reducer;
提示:
你只能在 Redux Toolkit 的
createSlice
和createReducer
中编写 直接更改原state的 逻辑,因为它们在内部使用 Immer!
action creator自动生成
createSlice
函数会自动生成与我们编写的 reducer 函数同名的 action creator,保存在slice的actions属性里面。
action的生成规则
name
选项的字符串用作每个 action type的第一部分,每个 reducer 函数的键名用作第二部分。因此,"counter"
名称 + "increment"
reducer 函数生成了一个 action 类型 {type: "counter/increment"}
。
xxxxxxxxxx
const newState = counterSlice.reducer(
{ value: 100 },
counterSlice.actions.increment()
)
console.log(newState)//101