【问题标题】:Unable to destruct the passed values in the context provider using 'useContext' hook无法使用“useContext”挂钩破坏上下文提供程序中传递的值
【发布时间】:2020-04-26 08:54:26
【问题描述】:

沙盒中的代码:https://codesandbox.io/s/goofy-dhawan-n2kk2?file=/src/components/NavBar.jsx

错误:TypeError: Cannot destructure property 'books' of 'Object(...)(...)' as it is undefined.

【问题讨论】:

    标签: reactjs react-hooks use-context


    【解决方案1】:

    默认情况下,您正在导出一个组件,它是上下文提供者。如果你想在其他地方使用上下文,那么你应该在导入时解构它,因为它不是默认导出。

    import React, { useContext } from "react";
    import { BookContext } from "../contexts/BookContexts";
    
    const NavBar = () => {
      // Error is here
      const { Books } = useContext(BookContext);
      // Error is here
      return (
        <div className="navbar">
            <h1>Reading list</h1>
            <p>We currently have {Books.length} to read</p>
        </div>
      );
    };
    export default NavBar;
    

    App.js

    import React from "react";
    import "./styles.css";
    import NavBar from './components/NavBar';
    import BookContextProvider from "./contexts/BookContexts";
    
    export default function App() {
      return (
        <div className="App">
          <BookContextProvider>
          <NavBar />
          <h1>Hello CodeSandbox</h1>
          <h2>Start editing to see some magic happen!</h2>
          </BookContextProvider>
        </div>
      );
    }
    

    BookContexts.js

    import React, { useState, createContext } from "react";
    import uuid from "uuid/v1";
    export const BookContext = createContext({
      Books: [],
      addBook: () => {},
      delBook: () => {}
    });
    
    const BookContextProvider = props => {
      const [Books, setBooks] = useState([
        { title: "title 1", author: "Author 1", id: 1 },
        { title: "title 12", author: "Author 2", id: 2 }
      ]);
      // eslint-disable-next-line
      const addBook = (title, author) => {
        setBooks([...Books, { title: title, author: author, id: uuid() }]);
      };
      // eslint-disable-next-line
      const delBook = id => setBooks(Books.filter(book => book.id !== id));
      return (
        <BookContext.Provider value={{ Books, addBook, delBook }}>
          {props.children}
        </BookContext.Provider>
      );
    };
    export default BookContextProvider;
    

    这里是固定沙盒link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 2020-09-05
      • 2020-06-13
      • 1970-01-01
      • 2021-07-12
      • 2020-10-20
      • 2019-12-03
      相关资源
      最近更新 更多