开发者问题收集

TypeError:无法解构“Object(...)(...)”的属性“setValues”,因为它未定义。(react / create-react-app)

2021-05-15
1228

我遇到了 TypeError: Cannot destructure property 'setValues' of 'Object(...)(...)' as it is undefined. 错误,我不知道为什么。我有一段来自 App.js 的代码:

import { DataProvider, useData } from "./DataContext";

function App({ ...rest }) {

  const { setValues, data } = useData();

...

和 DataContext.js

import React, { createContext, useState, useContext } from "react";

const DataContext = createContext();

export const DataProvider = ({ children }) => {
  const [data, setData] = useState({});

  const setValues = (values) => {
    setData((prevData) => ({
      ...prevData,
      ...values
    }));
  };

  return (
    <DataContext.Provider value={{ data, setValues }}>
      {children}
    </DataContext.Provider>
  );
};

export const useData = () => useContext(DataContext);

这是完整代码的 CodeSandBox 链接:

https://codesandbox.io/s/react-app-test-wvmlp?file=/src/App.js

2个回答

在您的沙盒中,您可能没有在 Index.js 中使用 DataProvider

import { StrictMode } from "react";
import ReactDOM from "react-dom";
import { DataProvider} from "./DataContext";

import App from "./App";

const rootElement = document.getElementById("root");
ReactDOM.render(
  <StrictMode>
   <DataProvider>
    <App />
   </DataProvider>
  </StrictMode>,
  rootElement
);
Daphaz
2021-05-15

您的 useContext 与 DataContext 连接,后者从 {{ data, setValues }> 获取初始数据。

因此,当您在消费者 App 中使用它时,需要

const { data, setValues } = useData();

这可能是第一个拼写错误。但也许问题不在这里。

您是否先尝试过在应用程序的一部分中触发 DataProvider

<DataProvider>
     <App>
        <YOURCOMPONENT />
     </App>
  </DataProvider>
  <DataProvider>
     <App2 />
  </DataProvider>

我明白这是作者希望您使用的,然后在您的组件中使用 useData

windmaomao
2021-05-15