React @reduxjs/toolkit 使用详解

  1. 安装
npm install @reduxjs/toolkit react-redux
  1. 配置store
// src/store/index.js
import { configureStore } from "@reduxjs/toolkit";
import counterSlice from "./features/counterSlice";
// configureStore创建一个redux数据
export default configureStore({
  reducer: {
    counter: counterSlice,
  },
});

  1. 配置slice
// src/store/features/counterSlice.js
import { createSlice } from "@reduxjs/toolkit";

export const counterSlice = createSlice({
  name: "counter", // 命名空间,在调用action的时候会默认的设置为action的前缀
  // 初始值
  initialState: {
    count: 1,
  },
  // 这里的属性会自动的导出为actions,在组件中可以直接通过dispatch进行触发
  reducers: {
    increment(state, { payload }) {
      state.count = state.count + payload.step; // 内置了immutable
    },
    decrement(state) {
      state.count -= 1;
    },
  },
});

// 导出actions
export const { increment, decrement } = counterSlice.actions;

// 内置了thunk插件,可以直接处理异步请求
export const asyncIncrement = (payload) => (dispatch) => {
  setTimeout(() => {
    dispatch(increment(payload));
  }, 2000);
};

export default counterSlice.reducer; // 导出reducer,在创建store时使用到

  1. 使用
//index.js
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>
);


//test.jsx
//在组件内部,使用useSelector和useDispatch可以直接获取state数据与dispatch方法
import { useSelector, useDispatch } from "react-redux";
import { increment, asyncIncrement } from "../../store/features/counterSlice"; // 引入actions

function Tset() {
  const { count } = useSelector((state) => state.user);
  const dispatch = useDispatch();
  return (
    <div className="App">
      <hr></hr>
      <button
        onClick={() => {
          dispatch(increment({ step: 2 })); // dispatch派发action
        }}
      >
        {count}
      </button>
      <hr />
      <button
        onClick={() => {
          dispatch(asyncIncrement({ step: 1 }));
        }}
      >
        {count}
      </button>
    </div>
  );
}

export default Tset;


  1. 异步 createAsyncThunk
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
// createAsyncThunk创建一个异步的action,这个方法被触发的时候会有三个状态
// pending(进行中) fulfilled(成功) rejected(失败)

// 发起网络请求获取数据
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());

// 这个action是可以直接调用的,用来处理异步操作获取数据
export const loadData = createAsyncThunk("movie/loadData", async () => {
  const res = await loadMoviesAPI();
  return res; // 此处的返回结果会在 .fulfilled中作为payload的值
});

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;


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值