react(9)-redux

使用CRA快速创建react项目

npx create-react-app react-redux

安装配套工具

npm i @reduxjs/toolkit react-redux

启动项目

在创建项目时候会出现一个问题

You are running `create-react-app` 5.0.0, which is behind the latest release (5.0.1).

We no longer support global installation of Create React App.

Please remove any global installs with one of the following commands:

  • npm uninstall -g create-react-app

  • yarn global remove create-react-app

The latest instructions for creating a new app can be found here:

解决办法

卸载全局安装的create-react-app

javascript 复制代码
npm uninstall -g create-react-app
npx clear-npx-cache
npm i create-react-app
npx create-react-app@latest xxxxx项目名

案例:

创建store文件夹

使用store数据和方法的基本步骤

1、引入import { createSlice } from "@reduxjs/toolkit";

初始化值

//初始化state

javascript 复制代码
  initialState: {
    count: 0
  },

创建使用方法

javascript 复制代码
  // 修改状态的方法 同步方法 支持直接修改
  reducers: {
    increment: state => {
      state.count += 1;
    },
    decrement: state => {
      state.count -= 1;
    }
  }

解构导出

javascript 复制代码
// 导出actions和reducers
const { increment, decrement } = counterStore.actions;
const  reducer  = counterStore.reducer;
// 按需导出
export { increment, decrement }; 
// 默认导出
export default reducer;

整体

javascript 复制代码
import { createSlice } from "@reduxjs/toolkit";

const counterStore = createSlice({
  name: "counter",
  //初始化state
  initialState: {
    count: 0,
  },
  // 修改状态的方法 同步方法 支持直接修改
  reducers: {
    increment: (state) => {
      state.count += 1;
    },
    decrement: (state) => {
      state.count -= 1;
    },
  },
});
// 结构counterStore

// 导出actions和reducers
const { increment, decrement } = counterStore.actions;
const reducer = counterStore.reducer;
// 按需导出
export { increment, decrement };
// 默认导出
export default reducer;

2、在index文件中使用

javascript 复制代码
import { configureStore } from "@reduxjs/toolkit";
import counterReducer from "./modules/counterStore";
const store=configureStore({
  reducer: {
    counter: counterReducer
  }
});
export default store;

3、index文件中添加 Provider

javascript 复制代码
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>
);

4、APP.js文件

javascript 复制代码
import { useDispatch,useSelector } from "react-redux";
import { decrement,increment } from "./store/modules/counterStore";


function App() {
 const {count}= useSelector(state=>state.counter)
 const dispatch= useDispatch()
  return (
    <div className="App">
      <button onClick={()=>dispatch(decrement())}>-</button>
      {count}
    <button onClick={()=>dispatch(increment())}>+</button>
    </div>
  );
}

export default App;

5 传参的写法

javascript 复制代码
 addToNum(state, action) {
      state.count += action.payload;
  }

不要忘记两个地方的导出

使用

javascript 复制代码
 <button onClick={()=>dispatch(addToNum(20))}>+</button>

案例2 异步获取数据

channenStore.js文件

javascript 复制代码
import { createSlice } from "@reduxjs/toolkit";
import axios from "axios";
// 创建store数据
const channelStore = createSlice({
  name: "channel",
  initialState: {
    channelList: [],
  },
  // 修改状态的方法
  reducers: {
    setChanles(state, action) {
      state.channelList = action.payload;
    },
  },
});
// 导出actions和reducers
const { setChanles } = channelStore.actions;
const reducer = channelStore.reducer;
// 异步请求部分
const fetchChannlList = () => {
  return async (dispatch) => {
    const res = await axios.get("http://geek.itheima.net/v1_0/channels");
    dispatch(setChanles(res.data.data.channels));
  };
};
export { fetchChannlList };
export default reducer;

store的index文件

javascript 复制代码
import { configureStore } from "@reduxjs/toolkit";
import counterReducer from "./modules/counterStore";
import channelReducer from "./modules/channelStore";
const store=configureStore({
  reducer: {
    counter: counterReducer,
    channel: channelReducer
  }
});
export default store;

触发

javascript 复制代码
import { useDispatch, useSelector } from "react-redux";
import { decrement, increment, addToNum } from "./store/modules/counterStore";
// 引入异步函数 channelStore的函数方法
import { fetchChannlList } from "./store/modules/channelStore";
import { useEffect } from "react";

function App() {
  const { count } = useSelector((state) => state.counter);
// 获取channelList
  const { channelList } = useSelector((state) => state.channel);


  const dispatch = useDispatch();
  // 触发异步函数
  useEffect(() => {
    dispatch(fetchChannlList())
  },[dispatch])


  return (
    <div className="App">
      <button onClick={() => dispatch(decrement())}>-</button>
      {count}
      <button onClick={() => dispatch(increment())}>+</button>
      <button onClick={() => dispatch(addToNum(20))}>+</button>
  
  {/* 列表展示 */}
      <ul>
        {channelList.map((item) => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>
  
  
    </div>
  );
}

export default App;
相关推荐
环境栈笔记20 小时前
指纹浏览器安全评测方法:核对环境、数据与权限后再选型
前端·人工智能·后端·自动化
打妖妖灵滴哪吒20 小时前
前端开发/UI设计师-APP中如何进行可发现性设计
前端·ui
Kinghiee20 小时前
从使用场景切入前端常见设计模式
前端·设计模式
郭老二1 天前
【前端】vue3:编译步骤
前端
不在逃避q1 天前
Trae/Vs Code/Cursor命令行无法跑npm命令
前端·arcgis·npm
夏殇之殁1 天前
包中创建自定义列表项。 . 使用自定义列表项进行数据绑定 . 将天气预报数据保存到本地内存表,通过LiveBindings进行显示。 ...
服务器·前端·javascript
The Chosen One9851 天前
高进度算法模板速记(待完善)
java·前端·算法
陈随易1 天前
MoonBit抓包模块pcap,查看电脑的每一次联网通信
前端·后端·程序员
新中地GIS开发老师1 天前
WebGIS开发学生作品|低空航天管理与航线规划系统
前端·javascript·webgis·三维gis开发
用户059540174461 天前
大模型对话记忆持久化踩坑实录:用 Playwright 自动化测了 300 次,终于揪出会话丢失的真凶
前端·css