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;
相关推荐
你很易烊千玺31 分钟前
日常练习-数组 字符串常用的场景
前端·javascript·字符串·数组
weixin199701080161 小时前
[特殊字符] RESTful API 接口规范详解:构建高效、可扩展的 Web 服务(附 Python 源码)
前端·python·restful
存在的五月雨1 小时前
Vue3项目一些语法
前端·javascript·react.js
nashane2 小时前
HarmonyOS 6学习:Web组件同层渲染事件处理与智能长截图实现
前端·学习·harmonyos·harmonyos 5
大家的林语冰2 小时前
Node 2026 发布,JS 三大新功能上线,最后一个奇偶版本
前端·javascript·node.js
三*一2 小时前
Mapbox GL JS 自研面要素整形工具开发实录
开发语言·javascript·arcgis·ecmascript
nashane2 小时前
HarmonyOS 6学习:Web组件同层渲染触摸事件与长截图拼接实战
前端·学习·harmonyos·harmonyos 5
我的世界洛天依2 小时前
胡桃讲编程|续篇!用高数 + JS ES262 硬核解构:求乐正绫的值
javascript
GISer_Jing3 小时前
浏览器 Agent 插件开发规格书 (SPEC)
前端·ai·前端框架·edge浏览器