目录
  • useContext
    • 介绍
    • 使用
  • useReducer
    • 介绍
    • 使用(简单示例实现计算器)
  • 将useContext与useReducer整合

    useContext

    介绍

    与class中写法对比减少了代码量,省去了返回回调函数获取传来的值

    使用

    /**
     * useContext(减少组件层级)
     */
     import React, { useState, useRef, useContext } from 'react';
     const GlobalContext=React.createContext()//创建Context对象
    function FilmItem(){
        const value=useContext(GlobalContext)
        console.log(value)//可以拿到传过来的value
            return(
                    <div>
                        <span>{value.name}CSDN碰磕</span>
                    </div>
                 )
    }
     export default function MyContext() {
        return (
            //供应商
            <GlobalContext.Provider value={{
                name:"碰磕",
                age:18
            }}>
            <div>
                Context方案
                <FilmItem></FilmItem>
            </div>
            </GlobalContext.Provider>
        );
     }
    

    通过**useContext(GlobalContext)**就可以获取到传来值

    useReducer

    介绍

    将多个state放到对象中,进行统一管理

    使用(简单示例实现计算器)

    /**
     * useReducer(减少组件层级)
     */
     import React, {useReducer } from 'react';
     //处理函数
     const reducer=(pervState,action)=>{    //第一个参数是原数据,第二个参数是传来的数据
        let newarr={...pervState};//定义新对象拷贝
        switch(action.type){
            case "pengke-jian":
                newarr.count--
                return newarr        
            case "pengke-jia":
                newarr.count++
                return newarr
            default:
                return pervState   
        }
     }
     //外部的对象
     const intialState={
         count:0,
     }
     export default function MyReducer() {
        const [state,dispatch]=useReducer(reducer,intialState)
        return (
            <div>
                <button onClick={()=>{
                    dispatch({
                        type:"pengke-jian"
                    })
                }}>-</button>
                <span>{state.count}</span>
                <button onClick={()=>{
                    dispatch({
                        type:"pengke-jia"
                    })
                }}>+</button>
            </div>   
        )
     }
    

    将useContext与useReducer整合

    实现多个组件通过他们俩互相通信传值…

    /**
     * useReducer+useContext
     */
     import React, {useContext, useReducer } from 'react';
     const intialState={
         num1:"666",
         num2:"碰磕"
     }
     const reducer=(state,action)=>{
        let newarr={...state};
        switch(action.msg){
            case "change-num1":
                newarr.num1=action.value
                return newarr
            case "change-num2":
                newarr.num2=action.value
                return newarr
            default:
                return newarr
        }
     }
     const GlobalContext = React.createContext();
     export default function MyReducer2() {
        const [state,dispatch]=useReducer(reducer,intialState)
        return (
            <GlobalContext.Provider value={
                {
                    state,dispatch
                }
            }>
            <div>
               <Children1 />
               <Children2 />
               <Children3 />
            </div>   
            </GlobalContext.Provider>
        )
     }
    function Children1(){
        const {dispatch}=useContext(GlobalContext)//这里传值
        return <div style={{background:"red"}}>
            <button onClick={()=>{
                dispatch({
                    msg:"change-num1",
                    value:"被我修改了num1哈哈哈"
                })
            }}>改变值1</button>
            <button onClick={()=>{
                dispatch({
                    msg:"change-num2",
                    value:"被我修改了num2哈哈哈"
                })
            }}>改变值2</button>
        </div>
    }
    function Children2(){
        const {state}=useContext(GlobalContext)//拿到值
        return <div style={{background:"orange"}}>Children2---{state.num1}</div>
    }
    function Children3(){
        const {state}=useContext(GlobalContext)//拿到值
        return <div style={{background:"skyblue"}}>Children3---{state.num2}</div>
    }
    
    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。