


npm install @reduxjs/toolkit
yarn add @reduxjs/toolkit
react-redux + redux-toolkit 替换了 react-redux + reduxnpm install @reduxjs/toolkit react-redux
yarn add @reduxjs/toolkit react-redux
先简单介绍几个
官网全,还是看官网吧

import { configureStore } from '@reduxjs/toolkit';
export default configureStore({
reducer: {
},
});


function incrementOne(){
type:'INCREMENT_ONE'
}
function incrementNumber(number){
type:'INCREMENT_NUMBER',
number:number
}
export default{incrementOne,incrementNumber}
function countReducer(state = 0,action){
switch (action.type) {
case 'INCREMENT_ONE':
return state + 1;
case 'INCREMENT_NUMBER':
return state + action.number;
default:
return state;
}
}
export default{countReducer}
store.js,如下:
useDispatch dispatch actions。



组件将从 store 中看到新的 state 值,并使用新的数据重新渲染自己。
counterSlice.js
import {createSlice} from '@reduxjs/toolkit'
export const counterSlice = createSlice({
name: 'myFirstCounterSlice', //这个名字随便取 标识
initialState: {
value: 0, //初始值
},
reducers: { // 对比之前的reducer是一个函数,里面是根据不同的action的type判断的switch语句
incrementOne: (state) =>{ //下面生成 加 1 的action,等价于原先只有type的action
state.value += 1;
},
decrementOne: (state) =>{ //下面生成 减 1 的action,等价于原先只有type的action
state.value -= 1;
},incrementNumber: (state,action) =>{ //等价于不只有type一个参数的action
state.value += action.payload; //payload
}
}
});
// 为每个 case reducer 函数生成 Action creators
export const {incrementOne,decrementOne,incrementNumber} = counterSlice.actions;
const countReducer = counterSlice.reducer;
export default countReducer;
store.js
import { configureStore } from '@reduxjs/toolkit';
import countReducer from './reducerAndAction/counterSlice';
export default configureStore({
reducer: {
counterState: countReducer,
},
});
Counter.jsx
import {useRef} from "react";
import { useDispatch, useSelector } from 'react-redux'
import {incrementOne,decrementOne,incrementNumber} from '../redux/reducerAndAction/counterSlice'
function Couter(){
// console.log(props);
const numberRef = useRef();
const count = useSelector((state)=>state.counterState.value);
const dispatch = useDispatch();
//加 1 的
function addOne(){
dispatch(incrementOne());
}
//动态增加
function addNumber(){
const stringNumber = numberRef.current.value; //直接取取的是字符串
const number = parseInt(stringNumber);
const addNumberAction = incrementNumber(number); //有参数的action
dispatch(addNumberAction);
}
return(
<div>
当前数值是:{count} <br />
<button onClick={addOne}>点我+1</button>
<button onClick={()=>dispatch(decrementOne())}>点我-1</button>
<br /><br />
<input type="number" ref={numberRef} placeholder="请输入要加的数"/>
<button onClick={addNumber}>加数</button>
</div>
)
}
export default Couter;






state.value += action.payload; //payload ,下面举个例子,如果还用原先的redux的话,action也可以如下写法:
var id = 1
function addTodo(content) {
return {
type: 'ADD_TODO',
payload: {
id: id++,
content: content, // 待办事项内容
completed: false // 是否完成的标识
}
}
}
action.payload 为啥要这么用,为了规范呗,不管你传的是什么参数,数字还是对象,都是action.payload,看一下我们上面的例子就更好理解了,如下:
