Я получаю следующее предупреждение:
Любое использование объекта с ключом должно быть завернуто в файл React.addons.createFragment(object) перед передачей в качестве дочернего элемента.
Что вызывает эту ошибку и как ее исправить?
Я получаю следующее предупреждение:
Любое использование объекта с ключом должно быть завернуто в файл React.addons.createFragment(object) перед передачей в качестве дочернего элемента.
Что вызывает эту ошибку и как ее исправить?
Эта ошибка возникает, если вы пытаетесь интерполировать объект JavaScript (а не элемент или строку JSX) в некоторый JSX.
Например, здесь маленький случай, который выдает предупреждение:
import React from 'react';
window.React = React;
import ReactDOM from 'react-dom';
var content = {foo: 'bar'};
ReactDOM.render(<div>{content}</div>, document.getElementById('some-element'));
Несмотря на то, что сообщение об ошибке предлагает использовать createFragment
, тем более вероятным сценарием является то, что вы интерполируете переменную в некоторый JSX, который, по вашему мнению, был строка или элемент JSX, но на самом деле это какой-то другой объект.
Поскольку сообщение не сообщает вам, какое именно выражение в вашем JSX вызвало ошибку, вам придется отследить его другими способами - например, просмотрев diff в исходном контроле коммита, который создал ошибки или путем исключения половины ваших элементов JSX за один раз, пока не найдете ту, которая заставляет ошибку уйти.
Также была проблема, но моя причина несколько отличалась.
Я пытался выписать значение внутри объекта следующим образом:
var FooObject = React.createClass({
render: function() {
var object_to_write = {'foo': 'bar'};
return (
<div>
I expect this text to say <b>bar</b> and it says <b>{object_to_write}</b>
</div>
);
}
});
React дал мне ошибку keyed object should be wrapped
...
Но, конечно, моя ошибка была вызвана тем, что я не указывал, какое значение я хотел использовать (в этом примере, foo
), и он пытался отобразить весь объект.
Другой случай:
// Bad - this causes the warning
this.state = { content: {} }
render() {
return (
<div>
{this.state.content}
</div>
)
}
Не обрабатывать объект, а вместо него - строку.
// Good - no complaints
this.state = { content: "" }
render() {
return (
<div>
{this.state.content}
</div>
)
}
Другая возможная причина этого предупреждения: передача объекта React вместо массива.
// Bad - this causes the warning
var items = {
23 : <Todo name="some things">,
24 : <Todo name="other things">
};
return <ul>items</ul>
Вместо этого вы должны передавать только массивы элементов, например:
// Good - no complaints
var items = [
<Todo name="some things">,
<Todo name="other things">
];
return <ul>items</ul>