#javascript #reactjs
Вопрос:
Я получаю ошибку «у каждого ребенка в списке должна быть уникальная опора для ключа», но я в замешательстве, потому что пытаюсь установить ключ на уникальный идентификатор, и кажется, что это не работает. Я использую imdbID в качестве ключа, который должен быть значением первичного ключа (уникальным и стабильным). Мой синтаксис неверен, или что я здесь делаю неправильно ?
import React from 'react';
import "./movie.css";
class Movie extends React.Component {
render() {
const {Title, Poster, Year, imdbID} = this.props;
return (
<div className="movie" key={imdbID} id={imdbID}>
<div className="title-year">
<h1 className="title">{Title}</h1>
<h2 className="year">{Year}</h2>
</div>
<div className="poster">
<img src={Poster} alt="my movie poster"/>
</div>
</div>
)
}
}
export default Movie;
А вот код, который вставляет <Фильм…> в приложение (app.js):
render() {
return (
<div className="App">
<header className="App-header">
<Search handleSendRequest={this.sendRequest}/>
<div className="response">
{
this.state.movies amp;amp; this.state.movies.length ? this.state.movies.map((movie) => {
return <Movie {...movie}/>
})
: null
}
</div>
</header>
</div>
);
}
Комментарии:
1. Примените ключ к компоненту <Фильм />, в котором вы сопоставляете это.состояние.фильмы
Ответ №1:
Добавьте key
атрибут в теги фильмов и задайте уникальное значение. Как показано ниже
{
this.state.movies amp;amp; this.state.movies.length ? this.state.movies.map((movie, index) => {
return <Movie key={movie.imdbID} { ...movie
}
/>
}) :
null
}
Комментарии:
1. Я не знаю свойств фильмов, поэтому я использовал
index
. Спасибо за ваш комментарий. @Адам2. Модифицированный. @Адам
3. Я сделал это обновление, но я все еще получаю предупреждение. { это.состояние.фильмы amp;amp; это.состояние.фильмы. длина ? this.state.movies.map((фильм, индекс) => { возврат ><Ключ фильма={movie.imddID} {…фильм}/> }) : null }
4. Неважно-публикация кода здесь заставила меня увидеть, что у меня была опечатка в imddID, которая должна быть imdbID. Спасибо!
Ответ №2:
Вам нужен ключ сам по <Movie/>
себе:
{
this.state.movies amp;amp; this.state.movies.length ? this.state.movies.map((movie) => {
return <Movie key="HERE" {...movie}/>
})
: null
}
В частности, вам нужен ключ каждый раз, когда вы выполняете итерацию над объектом. В этом случае вы повторяете все сначала this.state.movies
.
Вам не нужен ключ внутри функции рендеринга фильма, куда вы его поместили, потому что в это время вы не повторяете какой-либо объект.
Ответ №3:
Опора «ключ» должна быть вставлена в <Movie/>
компонент, а не в div внутри него.