上下文 - 调度不是一个函数 (React)

Posted

技术标签:

【中文标题】上下文 - 调度不是一个函数 (React)【英文标题】:Context - dispatch is not a function (React) 【发布时间】:2020-12-27 13:21:44 【问题描述】:

对于 React 中的 context 和 reducer 来说非常新。我目前正在尝试使用 Context 从折线图上的事件中获取日期字符串。我使用的折线图来自 react-chartjs-2。

我的上下文设置和提供如下:

export const Context = createContext();

const initialState = 
  isShowCarousel: false,
  date: null,
  coin: null
;
const reducer = (state, action) => 
  switch (action.type) 
    case "GRAPH_CLICKED":
      return 
        ...state,
        isShowCarousel: true,
        date: action.payload.date,
        coin: action.payload.coin
      ;
    default:
      return state;
  
;

export default function LandingPage(props) 
  const classes = useStyles();
  const [state, dispatch] = useReducer(reducer, initialState);

然后像这样设置提供者:

 <div className=classNames(classes.main, classes.mainRaised)>
      <Context.Provider
          value=
            state,
            dispatch
          
        >
          <SectionCryptoPrices />
          <NewsCarousel date=state.date coin=state.coin />
          </Context.Provider>
        </div>   

然后我的折线图组件通过以下方式导入上下文:

import React,  useContext  from 'react';
import Line from 'react-chartjs-2';
import  Context  from "views/CryptoMashup/LandingPage";

function LineGraph (props) 
  const dispatch = useContext(Context);
  let coin = props.coin;
  
  const state = 
      labels: props.rowData.labels,
      datasets: [
        
          label: 'Price movement for ' + props.coin,
          fill: true,
          lineTension: 0.1,
          backgroundColor: 'rgba(75,192,192,1)',
          borderColor: 'rgba(0,0,0,1)',
          borderWidth: 2,
          data: props.rowData.prices
        
      ]
    
    
    return (
    // line graph
    <div className="line-graph">
        <Line
        data=state
        options=
            legend:
            display:true,
            position:'bottom'
            ,
            onClick: function(evt, element) 
              if(element.length > 0) 
                let ind = element[0]._index;
                let date = element[0]._xScale.ticks[ind];
                let payload = 
                  date,
                  coin
                
                dispatch(
                  type: "GRAPH_CLICKED",
                  payload: payload
                )
              
            
        
        />
    </div>
    );


export default LineGraph;

但是我得到以下信息:TypeError: dispatch is not a function

对此的任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您正在将一个对象传递给上下文提供者,因此您需要相应地对其进行破坏:

<Context.Provider value= state, dispatch > ...</Context.Provider>

const  state, dispatch  = useContext(Context)

// Same
const value = useContext(Context)
value.dispatch(...)

【讨论】:

以上是关于上下文 - 调度不是一个函数 (React)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Context API 挂钩中访问多个上下文的调度方法?

使用 React 测试库模拟上下文提供程序时出现“TypeError:react.useContext 不是函数”

React Context API,从子组件设置上下文状态,而不是将函数作为道具传递

如何将 fetch() 函数的结果传递给 React 上下文值,而不是我为钩子设置的默认值?

在 React 中使用 useContext 和 useReducer 创建新的键值对

1.2. 上下文切换:__schedule()