#javascript #reactjs
#javascript #reactjs
Вопрос:
Я новичок в Context API, во время игры с ним у меня возникли проблемы с доступом и настройкой состояния от дочернего элемента (Movie.js ).
Ошибка во время выполнения
Ошибка типа: объект не может быть итерирован (не удается прочитать символ свойства (Symbol.iterator))
Как это решить?
MovieContext.js — родительский
import React, { useState, createContext, Children } from "react";
export const MovieContext = createContext();
export const MovieProvider = (props) => {
const [movies, setMovie] = useState({
name: "Happy Potter",
releaseDate: "22 June 2015",
price: 20,
id: 23232,
});
return <MovieContext.Provider>{props.children}</MovieContext.Provider>;
};
App.js
import React from "react";
import "./App.css";
import Movie from "./Movie";
import { MovieContext, MovieProvider } from "./MovieContext";
function App() {
return (
<div className="App">
<header className="App-header">
<MovieProvider>
<Movie />
</MovieProvider>
</header>
</div>
);
}
export default App;
Movie.js — дочерний элемент
import React, { useState, useContext } from "react";
import { MovieContext } from "./MovieContext";
const Movie = () => {
const [movies, setMovie] = useContext(MovieContext);
return (
<div>
<h3>{movies.name}</h3>
<h2>{movies.releaseDate}</h2>
<h2>{movies.price}</h2>
</div>
);
};
export default Movie;
Комментарии:
1. Сообщение об ошибке во время выполнения: «TypeError: объект не поддается повторению (не удается прочитать символ свойства (Symbol.iterator))»
2. Вы просто забыли передать значение своему провайдеру
Ответ №1:
[фильмы, setMovie] должны быть переданы в качестве реквизитов в MovieContext.Поставщик.
return (
<MovieContext.Provider value={[movies, setMovie]}>
{props.children}
</MovieContext.Provider>
);
Примечание: props — это массив, а не объект [фильмы, setMovie]
Ответ №2:
Вам необходимо передать состояние фильмов в content Provider для последующего использования.
return <MovieContext.Provider
value={{
movies,
setMovies
}}>
{props.children}
</MovieContext.Provider>;
};
Комментарии:
1. Также не забудьте заменить скобки useContext на фигурные скобки.