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

一. React_redux工作原理图

在这里插入图片描述

二. React_redux工作具体代码

1. src目录结构

该项目有Count和Person两个组件
在这里插入图片描述

2. index.js文件

2.1 引入Provider组件

目的: 此处需要用Provider包裹App,目的是让App所有的后代容器组件都能接收到store

import { Provider } from 'react-redux'

2.2 使用Provider

ReactDOM.render(
    // 此处需要用Provider包裹App,目的是让App所有的后代容器组件都能接收到store
    <Provider store={store}>
        <App />
    </Provider>,
    document.getElementById('root')
)

3. App.js文件

引入并使用容器组件

import React, { Component } from 'react'
import Count from './containers/Count'//引入count的容器组件
import Person from './containers/Person'//引入Person的容器组件

export default class App extends Component {
  render() {
    return (
      <div>
        <Count />
        <hr />
        <Person/>
      </div>
    )
  }
}

4. redux文件夹

4.1 redux > store.js

该文件专门用于暴露一个store对象,整个应用只有一个store对象

// 引入createStore,专门用于创建redux中最为核心的store对象
import { createStore, applyMiddleware} from 'redux'
// 引入汇总后的reducer
import reducer from './reducers'
// 引入redux-devtools-extension
import {composeWithDevTools} from 'redux-devtools-extension'
//引入redux-thunk,用于支持异步action
import thunk from 'redux-thunk'


// 暴露store
export default createStore(reducer, composeWithDevTools(applyMiddleware(thunk)))

4.2 redux > constant.js

该模块是用于定义action对象中type类型的常量值
目的只有一个:便于管理的同时,防止程序员写错

export const INCREMENT = 'increment'
export const DECREMENT = 'decrement'
export const ADD_PERSON = 'add_person'

4.3 redux > action
4.3.1 Count 组件的action
(1)引入constant.js

import { INCREMENT, DECREMENT } from '../constant'

(2)同步action

同步action–就是值action的值为Object类型的一般对象

export const increment = data => ({ type: INCREMENT, data })
export const decrement = data => ({ type: DECREMENT, data })

(3)异步action

异步action–就是值action的值为函数,异步action中一般都会调用同步action,异步action不是必须要用的

export const incrementAsync = (data, time) => {
    return (dispatch) => {
        setTimeout(()=>{
            //通知redux加data
            dispatch(increment(data))
        },time)
    }
}

4.3.2 Person组件的action

import { ADD_PERSON } from '../constant'
//创建增加一个人的action对象
export const addPerson = personObj => ({ type: ADD_PERSON, data: personObj })

4.4 redux > reducer
4.4.1 redux > reducer > index.js

该文件用于汇总所有的reducer作为一个总的reducer

// 引入combineReducers,用于汇总多个reducer
import {combineReducers} from 'redux'
//引入为count组件服务的reducer
import count from './count'
//引入为person组件服务的reducer
import person from './person'

//combineReducers中传入的对象就是redux帮我们保存的总状态对象
// 汇总所有的reduser变成一个总的reduser
export default combineReducers({
    // key:value
    count,
    person
})

4.4.2 redux > reducer > count.js

1.该文件是用于创建一个为Count组件服务的reducer,reducer本质是一个函数
2.reducer函数会接收到两个参数,分别是:之前的状态(preState),动作对象(action)

import { INCREMENT, DECREMENT } from '../constant'
//初始化状态
const initState = 0
export default function countReducer(preState = initState, action) {
    //从action对象中获取:type,data
    const { type, data } = action
    //根据type决定如何加工数据
    switch (type) {
        case INCREMENT://如果是加
            return preState + data
        case DECREMENT://如果是减
            return preState - data
        default:
            return preState
    }
}

4.4.2 redux > reducer > person.js

import {ADD_PERSON} from '../constant'

//初始化状态
const initState = [{ id: '001', name: 'tom', age: 18 }]
export default function personReducer(preState = initState, action){
    // 从action对象中获取type,data
    const {type,data}=action

    //根据type决定如何加工数据
    switch (type) {
        case ADD_PERSON://若是添加一个人
            return [data,...preState]
        default:
            return preState
    }
}

5.container容器组件

5.1 引入connect用于连接UI组件与redux

import { connect } from 'react-redux'
import { increment } from '../../redux/actions/count'

5.2 使用connect()()创建并暴露一个Count的容器组件

export default connect(
	//映射状态
    state => ({ 
        count: state.count ,
        persons:state.person.length
    }),
    
    // mapDispatchToProps的简写:对象自动调用dispatch
    //映射状态的方法
    {
    	//key:value
    	//value:从redux/actions/count引入
        increment:imcrement
        decrement,
        incrementAsync
    }
)(Count)

5.3 定义UI组件 (以求和以及person组件传参为例)
5.3.1 render中

 render() {
       // console.log(this.props);
        return (
            <div>
            	//count和persons是从容器组件中传递过来的
                <h3>当前求和为:{this.props.count},下方人数为:{this.props.persons}</h3>
                <br />
                <button onClick={this.increment}>+</button>
            </div>
        )
    }

5.3.2 加法 imcrement 方法

increment = () => {
        // 用户加多少
        const { value } = this.selectNumber
        //通知redux加value
        this.props.increment(value * 1)
    }
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:14:48  更:2022-03-30 18:18:35 
 
开发: 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年11日历 -2024/11/24 5:06:31-

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