1. 安装
npm install redux
npm install react-redux
npm install @reduxjs/toolkit
2. store创建configureStore
import { configureStore } from '@reduxjs/toolkit'
import counterReducer from './modules/counter'
const store = configureStore({
reducer: {
counter: counterReducer
},
devTools: true,
})
export default store
3. 创建reducer模块 createSlice
import { createSlice } from '@reduxjs/toolkit'
const counterSlice = createSlice({
name: 'counter',
initialState: {
counter: 90
},
reducers: {
incrementNumber(state, action) {
state.counter = state.counter + action.payload
},
decrementNumber(state, action) {},
}
})
export const {incrementNumber, decrementNumber} = counterSlice.actions
export default counterSlice.reducer
4. 在某个组件中使用
4.1 入口index.js文件配置
import React from 'react';
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux'
import store from './store'
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<Provider store={store}>
<App />
</Provider>
)
4.2组件中使用
import React, { PureComponent } from "react";
import { connect } from "react-redux";
import { incrementNumber, decrementNumber } from "../store/modules/counter";
import { asyncFetchRecommends } from "../store/modules/recommends";
export class home extends PureComponent {
increment(num) {
this.props.incrementNumber(num);
}
decrement(num) {
this.props.decrementNumber(num);
}
componentDidMount() {
this.props.asyncGetRecommends();
}
render() {
const { counter, recommends } = this.props;
return (
<div className="wrap">
<h2>{counter}</h2>
<button onClick={() => this.increment(10)}>+</button>
<button onClick={() => this.decrement(8)}>-</button>
<ul>
{recommends.map((item) => {
return <li key={item}>{item}</li>;
})}
</ul>
</div>
);
}
}
const mapStateToProps = (state) => ({
counter: state.counter.counter,
recommends: state.recommends.recommends,
});
const mapDispatchToProps = (dispatch) => ({
incrementNumber(num) {
dispatch(incrementNumber(num));
},
decrementNumber(num) {
dispatch(decrementNumber(num));
},
asyncGetRecommends() {
dispatch(asyncFetchRecommends());
},
});
export default connect(mapStateToProps, mapDispatchToProps)(home);
4.3 异步recommends
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'
export const asyncFetchRecommends = createAsyncThunk('recommendsName', async(a, {dispatch})=>{
const res = await axios.get("XXXXX")
const recommends = res.data.data.recommend.list;
dispatch(changeRecommends(recommends))
})
const recommendSlice = createSlice({
name: 'recommends',
initialState: {
recommends: []
},
reducers: {
changeRecommends(state, action) {
state.recommends = action.payload
}
},
extraReducers: {
}
})
export const {changeRecommends} = recommendsSlice.actions
export default recommendsSlice.reducer