#javascript #reactjs #destructuring #react-context
#javascript #reactjs #деструктурирование #реагировать-контекст
Вопрос:
Это мой контекст, и я хочу использовать его в своем компоненте BookList.
import React, { createContext, useState } from "react"
import { v4 as uuidv4 } from "uuid"
export const BookContext = createContext()
const BookContextProvider = (props) => {
const [books, setBooks] = useState([
{ title: "Deek Work", author: "Cal Newport", id: 0 },
{ title: "Principles", author: "Ray Dalio", id: 1 },
{ title: "Sapiens", author: "Yuval Noah Harari", id: 2 },
{ title: "Grit", author: "Angela Duckworth", id: 3 },
{ title: "Ikagai", author: "Hector Garcia", id: 4 },
])
const addBook = (title, author) =>
setBooks([...books, { title, author, id: uuidv4() }])
const removeBook = (id) => setBooks(books.filter((book) => book.id !== id))
return (
<BookContext.Provider value={{ books, addBook, removeBook }}>
{props.children}
</BookContext.Provider>
)
}
export default BookContextProvider
Компонент BookList:
import React, { useContext } from "react"
import { BookContext } from "../contexts/BookContext"
const BookList = () => {
const { books } = useContext(BookContext)
}
Почему переменная books находится внутри фигурных скобок, а не квадратных скобок? несмотря на то, что состояние, т.е. книги, создается с помощью useState hook, это массив.
Комментарии:
1. Это зависит от того, вы деструктурируете объект или массив? См developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…
2.
useState([
передается массив объектов. Это помогает?const st = [{theobjects here]; useState(st);
будет иметь тот же эффект3. @MarkSchultheiss да, понял, спасибо
4. Потому
useContext(BookContext)
что возвращает{ books, addBook, removeBook }
объект, который вы передалиvalue
поставщику.
Ответ №1:
Почему переменная books находится внутри фигурных скобок, а не квадратных скобок?
Потому useContext(BookContext)
что возвращает { books, addBook, removeBook }
объект, который вы передали value
поставщику. Чтобы деструктурировать этот объект, вы используете фигурные скобки.
Конечно, books
сам по себе является массивом, но это не имеет значения — вы не разрушаете его, чтобы получить элементы массива. Чтобы сделать это, вы должны сделать что-то вроде
const [firstBook, secondBook, ...otherBooks] = books;
или даже за один раз:
const { books: [firstBook, secondBook, ...otherBooks] } = useContext(BookContext);
Ответ №2:
- [] используется для деструктурирования массивов
- {} используется для деструктурирования объектов
Согласно https://reactjs.org/docs/hooks-reference.html
useContext(BookContext)
«Принимает объект контекста (значение, возвращаемое из React.createContext) и возвращает текущее значение контекста для этого контекста».
Комментарии:
1. Можно также поместить массив в контекст реакции.
2. Это правильно, но сам «BookContext» является объектом, что означает, что вы должны использовать фигурные скобки, чтобы деструктурировать его и получить доступ к массиву.
3. Нет. Никто не разрушает
BookContext
объект, это не имеет смысла. Мы говорим о возвращаемом значенииuseContext(…)
.4. Да, это была моя ошибка, я имел в виду возвращаемое значение useContext() , оно по-прежнему является объектом контекста