首页 > 解决方案 > React context API-我如何从 useEffect 钩子中分派一个动作?

问题描述

在这个项目中,我使用React.createContext()方法来管理状态。我可以通过导入Context.Consumer并在类组件(或功能组件)的返回方法中使用此使用者来访问状态数据。见下面的例子:

function App(){

  return(
    <Consumer>
      {value=>{
                const {basket} = value;
                return <p> { basket.length() } </p>
            }
      }
    </Consumer>
  )
}

问题是我想从useEffect 钩子而不是从组件返回中调度一个动作

这就是我想做的:

function App() {

    useEffect(() => {
        auth.onAuthStateChanged(authUser => {
                if(authUser){
                    dispatch({ //I need to use dispatch methode here!!
                        type : 'SET_USER',
                        payload : authUser
                    })
                }
                else{
                    dispatch({ //I need to use dispatch methode here!!
                        type : 'SET_USER',
                        payload : null
                    })
                }
            })      

    }, [])
  
  return(...)
  
  }

StateProvider.js

import React, { Component } from 'react';
const  Context = React.createContext();

// 1. Selector
export const getSubtotal = (basket)=> basket?.reduce((amount,item)=> item.price + amount ,0);

// 2. Reducer
const reducer = (state,action)=>{
    switch(action.type){
        case 'ADD_TO_BASKET' :
            return{
                basket : [action.payload, ...state.basket],
            };
        case 'DELETE_FROM_BASKET' :
            const index = state.basket.findIndex(item=>item.id === action.payload)
            let basketCopie = [...state.basket]
            basketCopie.splice(index,1)
            return{
                basket : basketCopie
            };
        case 'SET_USER' :
            return{
                user : action.payload
            };
        default :
            return state
    }
}

// 3. Provider Classe
export class Provider extends Component {
    state = {
        basket : [], 
        user : null,
        dispatch : action=> this.setState(state=> reducer(state,action))
    }
    render() {
        return (
            <Context.Provider value={this.state} > {/* the value change after any reducer call*/}
                {this.props.children}
            </Context.Provider>
        );
    }
}

// 4. Consumer
export const Consumer = Context.Consumer;

标签: reactjsdispatchreducersconsumerreact-context

解决方案


好的,我知道这不是一个完整的答案,但我找到了一个我认为会对您有很大帮助的页面

带有钩子的上下文 api

它一步一步与你同行,它对我有很大帮助


推荐阅读