hooks的useReducer配合useContext实现跨组件共享通信

来源:程序思维浏览:4223次
当我们使用redux进行数据管理的时候,一般都是在根组件通过Provider的方式引入store,然后在每个子组件中,通过connect的方式使用高阶组件进行连接,这样造成的一个问题是,大量的高阶组件代码冗余度特别高,既然hooks带来了新特性,不如一起来用用看看。



先了解一下React.CreateContext,组件通信需要了解这个方法:

// 创建上下文
let {Provider, Consumer} = React.createContext()

// 假设我们有很多个组件,我们只需要在父组件使用Provider提供数据,然后我们就可以在子组件任何位置使用Consumer拿到数据,不存在跨组件的问题
// 提供数据
import React, {Component} from 'react';
import ReactDOM from 'react-dom';
let {Provider, Consumer} = React.createContext()
// 父组件
function Parent (props) {
    return (
        <div>
            <div>Parent: </div>
           <Son></Son>
        </div>
    )
}
// 子组件
function Son (props) {
    return (
        <div>
            <div>Son: </div>
            <Child></Child>
        </div>

    )
}
// 孙子组件
function Child (props) {
    return (
        <Consumer>
            {value => <div>
                value: {value}
            </div>}
        </Consumer>
    )
}
//使用Provider提供数据
ReactDOM.render(<Provider value="1">
    <Parent />
</Provider>, document.getElementById('root'));

了解React.CreateContext后,下面看看useReducer和useContext怎么实现跨组件通信吧?

pages/reducer.js页面代码:

import React,{useReducer} from 'react';
import {counterReducer,defaultState} from '../../hooksReducer/counterReducer';
import {ReactContext} from '../../context';
import ReducerComponent from './reducerComponent';
let iCount=0;

export default function HooksReducer() {
        const [state,dispatch]=useReducer(counterReducer,defaultState);
        // console.log(state);
        return (
            <div>
                <ReactContext.Provider value={{state,dispatch}}>
                    <ReducerComponent></ReducerComponent>
                </ReactContext.Provider>
                计数器: <button type="button" onClick={()=>{dispatch({type:"dec",data:{count:--iCount}})}}>-</button>{state.count}<button type="button" onClick={()=>{dispatch({type:"inc",data:{count:++iCount}})}}>+</button>
            </div>
        )
}

context/index.js页面代码:

import React from "react";

// 创建上下文,解决多个组件共享传值,不存在跨组件的问题
export const ReactContext = React.createContext();

hooksReducer/counterReducer.js页面代码:

export const defaultState={
    count:0
};
export const counterReducer=(state=defaultState,action)=>{
    switch (action.type) {
        case "dec":
            return {...state,...action.data};
        case "inc":
            return {...state,...action.data};
        default:
            return state;
    }
};

子组件pages/reducerComponent.js页面代码:

import React,{useContext} from 'react';
import {ReactContext} from "../../context";

export default function ReducerComponent() {
        //useContext:共享状态钩子
       const counterContext=useContext(ReactContext);
       // console.log(counterContext);
        return (
            <div>
                子组件计数器:<button type="button" onClick={()=>{counterContext.dispatch({type:"dec",data:{count:--counterContext.state.count}})}}>-</button>{counterContext.state.count} <button type="button" onClick={()=>{counterContext.dispatch({type:"inc",data:{count:++counterContext.state.count}})}}>+</button>
            </div>
        )
}

hooks代码示例下载
精品好课
Vue2+Vue3+ES6+TS+Uni-app开发微信小程序从入门到实战视频教程
2021年最新Vue2+Vue3+ES6+TypeScript和uni-app开发微信小程序从入门到实战视频教程,本课程教你如何快速学会VUE和uni-app并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己...
jQuery视频教程从入门到精通
jquery视频教程从入门到精通,课程主要包含:jquery选择器、jquery事件、jquery文档操作、动画、Ajax、jquery插件的制作、jquery下拉无限加载插件的制作等等......
HTML5基础入门视频教程易学必会
HTML5基础入门视频教程,教学思路清晰,简单易学必会。适合人群:创业者,只要会打字,对互联网编程感兴趣都可以学。课程概述:该课程主要讲解HTML(学习HTML5的必备基础语言)、CSS3、Javascript(学习...
最新完整React视频教程从入门到精通纯干货纯实战
React是目前最火的前端框架,就业薪资很高,本课程教您如何快速学会React并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习React高薪就...
React实战视频教程仿京东移动端电商
React是前端最火的框架之一,就业薪资很高,本课程教您如何快速学会React并应用到实战,对正在工作当中或打算学习React高薪就业的你来说,那么这门课程便是你手中的葵花宝典。
最新完整React+VUE视频教程从入门到精,企业级实战项目
React和VUE是目前最火的前端框架,就业薪资很高,本课程教您如何快速学会React和VUE并应用到实战,教你如何解决内存泄漏,常用库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习Re...
VUE2+VUE3视频教程从入门到精通(全网最全的Vue课程)
VUE是目前最火的前端框架之一,就业薪资很高,本课程教您如何快速学会VUE+ES6并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习VUE高薪就...
HTML5视频播放器video开发教程
适用人群1、有html基础2、有css基础3、有javascript基础课程概述手把手教你如何开发属于自己的HTML5视频播放器,利用mp4转成m3u8格式的视频,并在移动端和PC端进行播放支持m3u8直播格式,兼容...
收藏
扫一扫关注我们