- 安装
npm install @reduxjs/toolkit react-redux
- 配置store
import { configureStore } from "@reduxjs/toolkit";
import counterSlice from "./features/counterSlice";
export default configureStore({
reducer: {
counter: counterSlice,
},
});
- 配置slice
import { createSlice } from "@reduxjs/toolkit";
export const counterSlice = createSlice({
name: "counter",
initialState: {
count: 1,
},
reducers: {
increment(state, { payload }) {
state.count = state.count + payload.step;
},
decrement(state) {
state.count -= 1;
},
},
});
export const { increment, decrement } = counterSlice.actions;
export const asyncIncrement = (payload) => (dispatch) => {
setTimeout(() => {
dispatch(increment(payload));
}, 2000);
};
export default counterSlice.reducer;
- 使用
import React from "react";
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(
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>
);
import { useSelector, useDispatch } from "react-redux";
import { increment, asyncIncrement } from "../../store/features/counterSlice";
function Tset() {
const { count } = useSelector((state) => state.user);
const dispatch = useDispatch();
return (
<div className="App">
<hr></hr>
<button
onClick={() => {
dispatch(increment({ step: 2 }));
}}
>
{count}
</button>
<hr />
<button
onClick={() => {
dispatch(asyncIncrement({ step: 1 }));
}}
>
{count}
</button>
</div>
);
}
export default Tset;
- 异步 createAsyncThunk
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
const loadMoviesAPI = () =>
fetch(
"https://pcw-api.iqiyi.com/search/recommend/list?channel_id=1&data_type=1&mode=11&page_id=2&ret_num=48"
).then((res) => res.json());
export const loadData = createAsyncThunk("movie/loadData", async () => {
const res = await loadMoviesAPI();
return res;
});
export const movieSLice = createSlice({
name: "movie",
initialState: {
list: [],
totals: 0,
},
reducers: {
loadDataEnd(state, { payload }) {
state.list = payload;
state.totals = payload.length;
},
},
extraReducers: (builder) => {
builder
.addCase(loadData.pending, (state) => {
console.log("pending", state);
})
.addCase(loadData.rejected, (state, err) => {
console.log("rejected 失败", err);
})
.addCase(loadData.fulfilled, (state, action) => {
console.log("fulfilled 成功", state);
console.log("fulfilled action", action);
state.list = action.payload;
});
},
});
export const { loadDataEnd } = movieSLice.actions;
export default movieSLice.reducer;