react 09之状态管理工具1 redux+ react-thunk的使用实现跨组件状态管理与异步操作

这篇具有很好参考价值的文章主要介绍了react 09之状态管理工具1 redux+ react-thunk的使用实现跨组件状态管理与异步操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

react 09之状态管理工具1 redux+ react-thunk的使用实现跨组件状态管理与异步操作

  • npm install redux react-redux

  • npm i redux-thunk

  • redux-thunk

    • redux-thunk是一个Redux的中间件,它允许你在Redux中编写异步的action creators。

store / index.js store的入口文件

import { applyMiddleware, legacy_createStore } from 'redux';
// 引入redux-thunk,用于支持异步action
import reduxThunk from 'redux-thunk';
// 引入汇总后的reducer
import reducers from './reducers';

const store = legacy_createStore(reducers, applyMiddleware(reduxThunk))
export default store;

index.js 在项目入口文件 引入

import App from "./7redux/2使用thunk/App类";
import store from "./store/index.js";
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
    <Provider store={store}>
        <App />
    </Provider>
);

store / actionType.js 定义action的唯一标识

// 常量 唯一标识 标记当前action的唯一性
export const FORM_ADD_COUNT = 'form_addCount'
export const FORM_SUB_COUNT = 'form_subCount'
export const LIST_ADD_LIST = 'list_addList'

store / reducers / index.js

/*
	该文件用于汇总所有的reducer为一个总的reducer
*/
//引入combineReducers,用于汇总多个reducer
import { combineReducers } from "redux";
//引入为form组件服务的reducer
import form from "./form";
//引入为list组件服务的reducer
import list from "./list";

//汇总所有的reducer变为一个总的reducer
export default combineReducers({
  form,
  list,
});

store / actions / form.js

/*
	该文件专门为Form组件生成相关action对象
*/
import { FORM_ADD_COUNT, FORM_SUB_COUNT } from "../actionType";

export const form_addCount = (data) => ({ type: FORM_ADD_COUNT, data });
export const form_subCount = (data) => ({ type: FORM_SUB_COUNT, data });

export const formAddAsync = (data) => {
  return (dispatch) => {
    setTimeout(() => {
      dispatch(form_addCount(data));
    }, 2000);
  };
};

store / reducers / form.js

import { FORM_ADD_COUNT, FORM_SUB_COUNT } from "../actionType";
/**
 * form组件的reducer
 */
// 初始状态
let initSate = {
  count: 0
};
export default function formReducer(state = initSate, action) {
  switch (action.type) {
    case FORM_ADD_COUNT:
      return {
        ...state,
        count: state.count + 1
      }
    case FORM_SUB_COUNT:
      return {
        ...state,
        count: state.count - 1
      }
    default:
      return state;
  }
}

store / actions / list.js

/*
	该文件专门为List组件生成相关action对象
*/
import { LIST_ADD_LIST } from "../actionType";

// 同步action
export const list_addList = (data) => ({ type: LIST_ADD_LIST, data });

store / reducers / list.js

import { LIST_ADD_LIST } from '../actionType'

// 初始状态
const initSate = {
    list:[]
}

export default function listReducer(state=initSate,action){
    switch(action.type){
        case LIST_ADD_LIST:
            return {...state,list:[...state.list,action.data]}
        default:
            return state
    }
}

使用 App类.jsx

import React, { Component } from 'react';
import { connect } from "react-redux";
import { formAddAsync, form_addCount, form_subCount } from "../../store/actions/form";
import { list_addList } from "../../store/actions/list";
import ASon from "./ASon";
class App extends Component {
 state = {
 }
 componentDidMount() {}
 render(){
  // console.log('111',this.props);
  const { count,list } = this.props
  const addList = ()=>{
    let str = list && list.length ? '我是' + (list.length + 1) : '我是1'
    let arr = []
    arr.push(str)
    this.props.list_addList(arr)
  }
   return (
     <div>
      app
      <p>Count: {count}</p>
         <button onClick={this.props.form_addCount}>Increment</button>
         <button onClick={this.props.form_subCount}>Decrement</button>
         <button onClick={this.props.formAddAsync}>异步add</button>
         <div>----</div>
         <ASon></ASon>
         <div>----</div>
         <div>
          {
            list ? list.map((item,idx)=>{
              return (
                <div key={idx}>
                  {item}
                </div>
              )
            }) : ''
          }
         <button onClick={addList}>addList</button>
         </div>
     </div>
   )
 }
}

// 拿到redux的值
const mapStateToProps = (state) => {
  return {
    count: state.form.count,
    list: state.list.list,
  };
};
// 拿到redux 所触发的
const mapDispatchToProps = {
  form_addCount,
  form_subCount,
  formAddAsync,
  list_addList
}
export default connect(mapStateToProps, mapDispatchToProps)(App);

ASon.jsx

import React from 'react';
import { connect } from "react-redux";
import { form_addCount } from "../../store/actions/form";
const ASon = (props) => {
    return (
        <div className='content'>
          ASon 组件 count-{props.count} <br/>
          <button onClick={props.form_addCount}>Increment</button>
        </div>
    )
}

// 拿到redux的值
const mapStateToProps = (state) => {
  return {
    count: state.form.count
  };
};
// 拿到redux 所触发的
const mapDispatchToProps = {
  form_addCount,
}
export default connect(mapStateToProps, mapDispatchToProps)(ASon);

效果

react 09之状态管理工具1 redux+ react-thunk的使用实现跨组件状态管理与异步操作,React,react.js,前端,前端框架

react 09之状态管理工具1 redux+ react-thunk的使用实现跨组件状态管理与异步操作,React,react.js,前端,前端框架文章来源地址https://www.toymoban.com/news/detail-648198.html

到了这里,关于react 09之状态管理工具1 redux+ react-thunk的使用实现跨组件状态管理与异步操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【前端】React快速入门+Redux状态管理

    本文旨在记录react的基础内容,帮助有需要的同学快速上手,需要进一步了解描述更加稳妥和全面的信息,请查阅官方文档 官方文档点击这里进行跳转 react框架 vue,react,angular这几种主流前端框架使用频率较高…本质还是js库。 React.js是一个用于构建用户界面的JavaScript库。它由

    2024年02月12日
    浏览(49)
  • vue2(Vuex)、vue3(Pinia)、react(Redux)状态管理

    Vuex 是一个专为 Vue.js应用程序开发的状态管理模式。它使用集中式存储管理应用的所有组件的状态,以及规则保证状态只能按照规定的方式进行修改。 State(状态) :Vuex 使用单一状态树,即一个对象包含全部的应用层级状态。这个状态树对应着一个应用中的所有状态。 Gett

    2024年01月23日
    浏览(48)
  • 【实战】 九、深入React 状态管理与Redux机制(一) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(十六)

    学习内容来源:React + React Hook + TS 最佳实践-慕课网 相对原教程,我在学习开始时(2023.03)采用的是当前最新版本: 项 版本 react react-dom ^18.2.0 react-router react-router-dom ^6.11.2 antd ^4.24.8 @commitlint/cli @commitlint/config-conventional ^17.4.4 eslint-config-prettier ^8.6.0 husky ^8.0.3 lint-staged ^13.1.2 p

    2024年02月15日
    浏览(41)
  • 【实战】 九、深入React 状态管理与Redux机制(五) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十)

    学习内容来源:React + React Hook + TS 最佳实践-慕课网 相对原教程,我在学习开始时(2023.03)采用的是当前最新版本: 项 版本 react react-dom ^18.2.0 react-router react-router-dom ^6.11.2 antd ^4.24.8 @commitlint/cli @commitlint/config-conventional ^17.4.4 eslint-config-prettier ^8.6.0 husky ^8.0.3 lint-staged ^13.1.2 p

    2024年02月13日
    浏览(43)
  • 【实战】 九、深入React 状态管理与Redux机制(二) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(十七)

    学习内容来源:React + React Hook + TS 最佳实践-慕课网 相对原教程,我在学习开始时(2023.03)采用的是当前最新版本: 项 版本 react react-dom ^18.2.0 react-router react-router-dom ^6.11.2 antd ^4.24.8 @commitlint/cli @commitlint/config-conventional ^17.4.4 eslint-config-prettier ^8.6.0 husky ^8.0.3 lint-staged ^13.1.2 p

    2024年02月14日
    浏览(45)
  • 【MySQL | 进阶篇】09、MySQL 管理及常用工具(mysqladmin、mysqlbinlog、mysqldump 等)的使用

    目录 一、系统数据库 二、常用工具  2.1 mysql 示例 2.2 mysqladmin  示例  2.3 mysqlbinlog 示例 2.4 mysqlshow 示例 2.5 mysqldump(数据备份) 示例 2.6 mysqlimport/source(数据恢复) 2.6.1 mysqlimport 2.6.2 source Mysql 数据库安装完成后,自带了以下四个数据库,具体作用如下: 该 mysql 不是指 my

    2023年04月21日
    浏览(42)
  • Vue最新状态管理工具Pinia——彻底搞懂Pinia是什么

    知识专栏 专栏链接 Vuex知识专栏 https://blog.csdn.net/xsl_hr/category_12158336.html?spm=1001.2014.3001.5482 Vuex官方文档 https://vuex.vuejs.org/zh/ Pinia官方文档 https://pinia.web3doc.top/ 最近在 前端的深入学习过程 中,接触了与 状态管理 相关的内容,涉及到 与vue2适配的vuex 和 与vue3适配的pinia ,因此

    2024年02月03日
    浏览(51)
  • Vue中的Pinia状态管理工具 | 一篇文章教会你全部使用细节

    Pinia(发音为/piːnjʌ/,如英语中的“peenya”)是最接近piña(西班牙语中的菠萝)的词 ; Pinia开始于大概2019年,最初是 作为一个实验为Vue重新设计状态管理 ,让它用起来适合组合式API(Composition API)。 从那时到现在,最初的设计原则依然是相同的,并且目前同时兼容Vue2、

    2024年02月11日
    浏览(44)
  • 第n+2次安装前端环境-nvm管理包工具-配置react环境

    我之前电脑实在是没办法用nvm搭建前端环境!恼火,只能推倒重来了。 首先就先去将自己的电脑里面的原来的nvm软件删除了。除此之外还要看看有没有之前单独安装过nodejs的,如果之前单独安装过那也要删除掉。 今天我就是看到自己的电脑友nvm,以为能用,于是通过nvm切换不

    2024年02月09日
    浏览(41)
  • Vue2向Vue3过度Vue3状态管理工具Pinia

    Pinia 是 Vue 的专属的最新状态管理库 ,是 Vuex 状态管理工具的替代品 后面在实际开发项目的时候,Pinia可以在项目创建时自动添加,现在我们初次学习,从零开始: 使用 Vite 创建一个空的 Vue3项目 按照官方文档安装 pinia 到项目中 定义store 组件使用store Pinia中的 getters 直接使

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包