Почему React.createPortal допускает использование ключей, таких как элементы списка, а другие вещи, такие как <Suspense>, — нет?
Я видел некоторые API в ReactJs, позволяющие использовать ключи , например<React.Fragment>
, но в то же время<React.Suspense>
не имеет ключей.
Теперь конкретно, почемуReact.createPortal
разрешить ключ, например, элементы списка?
Мое исследование: я не нашел многого в SO или Google, но нашел одно обсуждение на github , которое, похоже, подразумевает, что ключи были добавлены в документацию после 18 апреля 2023 года.
1 ответ
Действительно, я сам считаю, что текущая документация React в некоторых областях немного скудна .
Я также не могу найти там явного утверждения относительно свойства в элементах JSX(не могу доказать отсутствие чего-либо, так что простите меня, если я это пропустил, и не стесняйтесь комментировать).
Реагировать.createElement()
ОБНОВЛЕНИЕ 19 июля 2023 г.:
Этот раздел оcreateElement()
вероятно, устарело.
Синтаксис JSX, по-видимому, больше не преобразуется (React v18), а вместо этого преобразуется в вызов внутреннегоjsx()
функция, которая, похоже, не должна вызываться разработчиком, я считаю, что она определена в /src/jsx/ReactJSXElement.js:
Предыдущий ответ:
В любом случае, зная, что JSX конвертируется вReact.createElement(...)
вызовы (которые, к моему удивлению, упомянуты в разделе «Legacy React API» ) , я вижу, что переданный метод будет обрабатыватьprops.key
имущество особым образом:
Обратите внимание, что
ref
и от твоегоprops
объект является особенным и не будет доступен какelement.props.ref
иelement.props.key
на возвращенииelement
. Они будут доступны какelement.ref
иelement.key
.
Также обратите внимание на устаревшую документацию :
Код, написанный с использованием JSX, будет преобразован для использования
React.createElement()
.
Вычет
Это общее утверждение о , поэтому каждый элемент, созданный с помощью , должен разрешать это свойство .
Предполагая, что по-прежнему верно, что каждый элемент JSX являетсяcreateElement
call, как это было раньше (слово «legacy» предполагает, что оно может измениться) , это означает, что каждый элемент JSX принимает свойство.
Поэтому мне кажется «ясным», что каждый элемент JSX принимает , но, на мой взгляд, это следует указать более явно.
<Реагировать.Фрагмент>
Я предполагаю, что в документации упоминается в
<React.Fragment>
явно, потому что это общий вопрос, как добавить к фрагменту, потому что фрагмент чаще записывается с использованием синтаксиса пустых скобок<>
, где вы не можете добавлять какие-либо свойства. Но это всего лишь предположение.
Реагировать.createPortal()
React.createPortal() отличается тем, что это не синтаксис JSX, поэтому для него требуется специальная документация.
Списки рендеринга
В разделе «Списки рендеринга» упоминаются свойства, но я считаю, что этого недостаточно, чтобы ответить на ваш вопрос.
Он ориентирован исключительно на ключи в «элементах списка»/«коллекциях»/«массивах» и ничего не говорит оkey
собственность в целом.