Ответ 1
Я разделяю свой ответ в двух разделах, чтобы охватить 2 основных момента, которые я вижу в вашем вопросе.
Раздел 1: Что такое фрагмент реакции?
Чтобы объяснить, что такое React Fragment, нам нужно сделать шаг назад и поговорить о React Keys.
Ключи help Реагировать, чтобы определить, какие элементы были изменены, добавлены или удалены. Они должны быть переданы элементам внутри массива, чтобы дать элементам устойчивое тождество (уникальность).
Лучший способ выбрать ключ - использовать строку, которая однозначно идентифицирует элемент списка среди своих братьев и сестер. Чаще всего вы будете использовать идентификаторы из ваших данных в качестве ключей. Вот практический пример:
render() {
const todoItems = todos.map((todo) =>
<li key={todo.id}>
{todo.text}
</li>
);
return todoItems;
}
Важно отметить, что todoItems
на самом деле представляет собой массив элементов <li>
.
Зная это, позвольте перейти к тому, почему вы получаете предупреждение в своем прецеденте.
В большинстве случаев вы можете использовать key
prop, чтобы указать ключи на возвращаемых вами элементах рендеринга, как и в примере выше. Тем не менее, это ломается в одной ситуации: если у вас есть два набора детей, которые вам нужно переупорядочить, нет возможности поместить ключ в каждый набор без добавления элемента оболочки.
Вот классический пример из недавно обновленного документа React:
function Swapper(props) {
let children;
if (props.swapped) {
children = [props.rightChildren, props.leftChildren];
} else {
children = [props.leftChildren, props.rightChildren];
}
return <div>{children}</div>;
}
Дети будут размонтироваться и монтироваться, когда вы изменяете опору swapped
, потому что нет никаких ключей, помеченных на двух наборах детей.
Чтобы решить эту проблему, вы можете использовать надстройку createFragment, чтобы предоставить ключи для наборов дочерних элементов. Следуйте расширенному примеру, используя createFragment
здесь.
Раздел 2: Но почему вы получаете это предупреждение?
В любом случае ошибка, с которой вы получаете ошибку, происходит просто потому, что вы пытаетесь интерполировать объект JavaScript (а не элемент JSX или строку) в некоторый JSX.
Хотя сообщение об ошибке предлагает использовать createFragment
, чтобы исправить это, причина в том, что вы интерполируете переменную в некоторый JSX, который не является элементом строки или JSX, но на самом деле является каким-то другим видом объекта!
Такое вводящее в заблуждение предупреждение в вашем случае использования, не так ли?: -)