【问题标题】:Getting InvalidValueError while passing state by useContext通过 useContext 传递状态时出现 InvalidValueError
【发布时间】:2021-10-14 07:16:32
【问题描述】:

我这样设置上下文提供程序

import { createContext, useState } from 'react';

export const AppContext = createContext(null);

export default ({ children }) => {
  const [centre, setCentre] = useState({
    lat: 53.719028,
    lng: -2.072784,
  });
  const [radius, setRadius] = useState(2 * 1000);

  const store = {
    radius: [radius, setRadius],
    centre: [centre, setCentre],
  };

  return <AppContext.Provider value={store}>{children}</AppContext.Provider>;
};

然后像这样设置我的index.js

import App from './App';
import AppProvider from './components/utilities/context';

ReactDOM.render(
  <AppProvider>
    <App />
  </AppProvider>,
  document.getElementById('root'),
);

我正在尝试使用 App.js 中组件的上下文,所以在我的 Map.js 组件中我有:

import { AppContext } from '../utilities/context';

...

const { radius, centre } = useContext(AppContext);

return (<GoogleMap
        mapContainerStyle={mapContainerStyle}
        zoom={6}
        center={centre}
        options={options}
        onLoad={(map) => onMapLoad(map)}
      >
      ...
      </GoogleMap>)

如果我从地图组件中console.log(centre) 我得到正确的值,应用程序编译正常,但地图没有呈现,我在控制台中收到此错误:

InvalidValueError: setCenter: not a LatLng or LatLngLiteral with finite coordinates: in property lat: not a number

【问题讨论】:

  • 我们不知道您应该将什么传递给 GoogleMap 组件,所以...我的意思是错误是不言自明的,该组件显然需要一个数字,但您传递了一个函数

标签: javascript reactjs react-context use-context


【解决方案1】:

您正在访问数组[radius, setRadius] const { radius, centre } = useContext(AppContext);

这就是我通常创建上下文提供程序的方式:

import { createContext, useState } from 'react';

export const AppContext = createContext(null);

export default ({ children }) => {
  const [centre, setCentre] = useState({
    lat: 53.719028,
    lng: -2.072784,
  });
  const [radius, setRadius] = useState(2 * 1000);

  const contextValues = { centre, radius };
  const contextFunctions = { setCentre, setRadius };

  return <AppContext.Provider value={{ ...contextValues, ...contextFunctions }}>{children}</AppContext.Provider>;
};

然后你可以像这样访问这些:

const { radius, centre, setRadius, setCentre } = useContext(AppContext);

【讨论】:

  • 非常感谢,很高兴知道我的原始实现是否有解决方法,不幸的是我使用的教程有点过时了,我没有回复我的 cmets
猜你喜欢
  • 2021-07-22
  • 1970-01-01
  • 2020-01-31
  • 2016-03-14
  • 2016-05-23
  • 2019-10-10
  • 1970-01-01
  • 2022-01-08
  • 2019-12-14
相关资源
最近更新 更多