【问题标题】:Using React Hooks for Data Provider and Data Context为数据提供者和数据上下文使用 React Hooks
【发布时间】:2023-03-19 07:15:01
【问题描述】:

我目前正在修改我的 DataProvider,使用 React Hooks 将其从类组件更新为功能组件。

我认为我的问题在于我设置上下文使用者的方式,但我还没有找到测试它的好方法。

DataProvider.js

import React, { createContext } from "react";

const DataContext = createContext();

export const DataProvider = (props) => {
  const [test, setTest] = React.useState("Hello");

  return (
    <DataContext.Provider value={test}>{props.children}</DataContext.Provider>
  );
};
export const withContext = (Component) => {
  return function DataContextComponent(props) {
    return (
      <DataContext.Consumer>
        {(globalState) => <Component {...globalState} {...props} />}
      </DataContext.Consumer>
    );
  };
};

所以我的 withContext 函数应该接收一个组件并将其传递给 Context Provider 的 props。

我尝试将我的测试状态拉入组件中。

import React from "react";
import style from "./DesktopAboutUs.module.css";
import { withContext } from "../../DataProvider";

const DesktopAboutUs = ({ test }) => {
  return (
    <div className={style.app}>
      <div>{test}</div>

    </div>
  );
};

export default withContext(DesktopAboutUs);

test 没有数据显示。对我来说,这表明我的 withContext 函数没有正确接收来自 Provider 的道具。

【问题讨论】:

  • 我想你的意思是value={{test}}
  • @PatrickRoberts 你为什么这么说?你说的不对。
  • @PraveenKumarPurushothaman globalStatetest,当value={test} 时是字符串而不是对象
  • 是的,我觉得一样,应该是value={{test}}。
  • @PatrickRoberts Ahhh...

标签: javascript reactjs


【解决方案1】:

因为您传递了value={test},所以globalState 是一个字符串,而不是具有test 属性的对象。

这些解决方案中的任何一个都会达到您的预期:

  • 如果您希望 globalState 包含多个道具,请使用 value={{ test }} 而不是 value={test} 将对象传递给 DataContext.Providervalue 道具。
  • 如果您不打算 globalState 包含多个道具,请使用 test={globalState} 而不是 {...globalState}globalState 传递给 Componenttest 道具。

const DataContext = React.createContext();

const DataProvider = (props) => {
  const [test, setTest] = React.useState("Hello");

  return (
    <DataContext.Provider value={{ test }}>
      {props.children}
    </DataContext.Provider>
  );
};

const withContext = (Component) => (props) => (
  <DataContext.Consumer>
    {(globalState) => <Component {...globalState} {...props} />}
  </DataContext.Consumer>
);

const DesktopAboutUs = ({ test }) => (
  <div>{test}</div>
);

const DesktopAboutUsWithContext = withContext(DesktopAboutUs);

ReactDOM.render(
  <DataProvider>
    <DesktopAboutUsWithContext />
  </DataProvider>,
  document.querySelector('main')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.14.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.14.0/umd/react-dom.production.min.js"></script>
<main></main>

【讨论】:

  • 我已经尝试更新&lt;DataContext.Provider value={{ test }}&gt;,但我仍然无法在我的组件中接收到这个道具。
  • @tdammon &lt;DataProvider&gt; 实际上在你的虚拟 DOM 中吗?查看我更新的答案,对我来说很好。
猜你喜欢
  • 1970-01-01
  • 2020-08-07
  • 2023-03-21
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多