У меня есть следующий код (очевидно, это всего лишь контрольный пример вопроса, жизнь сложнее ...). Этот код работает, но он выдает предупреждение:
У каждого дочернего элемента в массиве или итераторе должен быть уникальный «ключ».
Я новичок в React и javascript, но Я понимаю ошибку и Я понимаю, зачем нужны уникальные ключи . Как вы можете видеть, я действительно предоставляю ключи, и они действительно уникальны
var possible_variants = ["A", "B", "C"];
var variant = "";
class App extends React.Component {
render() {
return React.createElement(
"div",
null,
React.createElement(RadioButton, null)
);
}
}
class RadioButton extends React.Component {
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
}
handleChange(event) {
variant = event.target.value;
}
render() {
return React.createElement(
"div",
{
onChange: this.handleChange
},
possible_variants.map(function(my_variant, index) {
return React.createElement(
"label",
null,
React.createElement("input", {
type: "radio",
value: my_variant,
key: my_variant,
name: "variant"
}),
my_variant
);
})
);
}
}
ReactDOM.render(
React.createElement(App, null),
document.getElementById("container")
);
Кажется, проблема в том, что React "хочет", чтобы ключ был вместо метки обертки, т.е. если я изменил отображение на
possible_variants.map(function(my_variant, index) {
return React.createElement(
"label",
{
key: my_variant // <= here comes the difference
},
React.createElement("input", {
type: "radio",
value: my_variant,
name: "variant"
}),
my_variant
);
});
предупреждение исчезает.
Итак, мой вопрос, почему это так? Насколько я понял из официальной документации и из различных учебных пособий по net, для лучшей производительности нужно, чтобы ключ находился в наиболее специфической c вещи, которая может измениться для повторного рендеринга, и что здесь ввод, а не метка, которая фиксируется раз и навсегда.
Я что-то упустил?
PS: Для меня это похоже на Реагирует на уникальный ключ при отображении предупреждение