IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> React-Redux实现组件间数据共享+项目打包 -> 正文阅读

[JavaScript知识库]React-Redux实现组件间数据共享+项目打包

目录

上一个求和案例只用了一个组件,现在看看redux如何实现多个组件之间的数据共享。

1.步骤

①定义一个Person组件,和Count组件通过redux共享数据
②为Person组件编写:reducer、action,配置constant常量
③使用combineReducers对Count和Person的Reducer进行合并,合并后的总状态是一个对象。
④交给store的是总reducer

2.案例

/src/containers/Count/index.jsx

import {connect} from 'react-redux'
import React, { Component } from 'react'
// 引入action
import {
  increment,
  decrement,
  incrementAsync
} from '../../redux/actions/count'

// 定义CountUI组件
class Count extends Component {
  increment=()=>{
    const {value} = this.selectNumer
    this.props.increment(value*1)
  }
  decrement=()=>{
    const {value} = this.selectNumer
    this.props.decrement(value*1)
  }
  incrementAsync=()=>{
    const {value} = this.selectNumer
    this.props.incrementAsync(value*1,500)
  }
  render() {
    return (
      <div>
        <h1>当前求和为:{this.props.count},下方组件人数:{this.props.personCount}</h1>
        <select ref={c => this.selectNumer = c}>
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
        </select>&nbsp;
        <button onClick={this.increment}>+</button>&nbsp;
        <button onClick={this.decrement}>-</button>&nbsp;
        <button onClick={this.incrementAsync}>异步加</button>&nbsp;
      </div>
    )
  }
}
// 创建并暴露一个Count的容器组件
export default connect(
  state => ({count: state.count,personCount:state.persons.length}), 
  {
    increment,
    decrement,
    incrementAsync
  }
)(Count)

/src/containers/Person/index.jsx

import React, { Component } from 'react'
import { nanoid } from 'nanoid'
import { connect } from 'react-redux';
import { addPerson } from '../../redux/actions/person'

class Person extends Component {
  addPerson = () => {
    const name = this.nameNode.value;
    const age = this.ageNode.value;
    const personObj = {id:nanoid(),name,age};
    this.props.addPerson(personObj)
  }
  render() {
    return (
      <div>
        <h1>上方组件的求和为:{this.props.Count}</h1>
        <input ref={c=>this.nameNode = c} type="text" placeholder='输入名字' />&nbsp;
        <input ref={c=>this.ageNode = c} type="text" placeholder='年龄' />&nbsp;
        <button onClick={this.addPerson}>添加</button>
        <ul>
          {
            this.props.persons.map((p) => {
              return <li key={p.id}>{p.name}--{p.age}</li>
            })
          }
        </ul>
      </div>
    )
  }
}

export default connect(
  state => ({persons: state.persons,Count:state.count}),
  {
    addPerson
  }
)(Person)

/src/redux/actions/count.js

/*
  该文件专门为Count组件生成action对象
*/
import { INCREMENT, DECREMENT } from "../constant";

// 同步action,就是指action的值为一般object类型的对象
export const increment = data => ({type:INCREMENT,payload: data})
export const decrement = data => ({type:DECREMENT,payload: data})

// 异步action,就是指action的值为函数
export const incrementAsync = (data, time) => {
  return (dispatch)=>{
    setTimeout(()=>{
      dispatch(increment(data))
    },time)
  }
}

/src/redux/reducers/count.js/src/redux/actions/person.js

import {ADD_PERSON} from '../constant'

export const addPerson = personObj => ({type:ADD_PERSON,payload:personObj})

/src/redux/reducers/index.js

/*
  该文件用于汇总所有reducer为一个总的reducer
*/
import {combineReducers} from '@reduxjs/toolkit'
import count from './count' //引入为Count组件服务的reducer
import persons from './person' //引入为Person组件服务的reducer

export default combineReducers({
  count,
  persons
})

/src/redux/reducers/count.js

/*
  该文件是用于创建一个为Count组件服务的reducer
*/
import { INCREMENT,DECREMENT } from "../constant"

const initState = 0;
export default function countReducer(preState=initState, action) {
  const {type, payload} = action;
  switch(type) {
    case INCREMENT:
      return preState+payload;
    case DECREMENT:
      return preState-payload;
    default:
      return preState;
  }
}

/src/redux/reducers/person.js

import { ADD_PERSON } from "../constant";

const initState = [{id:'001',name:'tom',age:18}]
export default function personReducer(preState=initState,action) {
  const {type,payload} = action
  switch(type) {
    case ADD_PERSON:
      return [payload,...preState]
    default:
      return preState
  }
}

/src/redux/constant.js

/*
  该模块用于定义action对象中type类型的常量值
*/
export const INCREMENT = 'increment'
export const DECREMENT = 'decrement'
export const ADD_PERSON = 'add_person'

/src/redux/store.js

/*
  该文件用于暴露一个store对象
*/
import {configureStore} from '@reduxjs/toolkit'
import reducer from './reducers'

export default configureStore({ reducer: reducer })

/src/App.jsx

import Count from "./containers/Count"; //引入Count的容器组件
import Person from "./containers/Person" //引入Person的容器组件

function App() {
  return (
    <div>
      <Count/>
      <hr />
      <Person />
    </div>
  );
}

export default App;

/src/index.js?

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import store from './redux/store';
import { Provider } from 'react-redux';  // provider会自动帮容器组件传store

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
	<Provider store={store}>
		<App />
	</Provider>
);

效果

3.打包项目

全局安装serve库,并配置一下环境变量

npm i serve -g

将上面的项目打包,在项目根目录下面执行如下指令,会生成一个build文件夹

npm run build

在生产环境运行该项目,serve指令后面跟的build文件夹的路径

serve build

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:19:49  更:2022-11-05 00:22:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 19:50:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码