Невозможно уничтожить переданные значения в поставщике контекста, используя хук 'useContext' - PullRequest
0 голосов
/ 26 апреля 2020

код в песочнице: https://codesandbox.io/s/goofy-dhawan-n2kk2?file=/src/components/NavBar.jsx

Ошибка: TypeError: Cannot destructure property 'books' of 'Object(...)(...)' as it is undefined.

1 Ответ

1 голос
/ 26 апреля 2020

Вы экспортируете компонент по умолчанию, который является поставщиком контекста. Если вы хотите использовать контекст где-то еще, вам следует выполнить деструктуризацию при его импорте, поскольку он не является экспортом по умолчанию.

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;

Вот исправленная песочница ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...