Я пытаюсь настроить свое React.js
приложение так, чтобы оно отображало только переменную, которую я установил true
.
То, как настроена моя функция рендеринга, выглядит так:
render: function() {
var text = this.state.submitted ? 'Thank you! Expect a follow up at '+email+' soon!' : 'Enter your email to request early access:';
var style = this.state.submitted ? {"backgroundColor": "rgba(26, 188, 156, 0.4)"} : {};
return (
<div>
if(this.state.submitted==false)
{
<input type="email" className="input_field" onChange={this._updateInputValue} ref="email" value={this.state.email} />
<ReactCSSTransitionGroup transitionName="example" transitionAppear={true}>
<div className="button-row">
<a href="#" className="button" onClick={this.saveAndContinue}>Request Invite</a>
</div>
</ReactCSSTransitionGroup>
}
</div>
)
},
По сути, важной частью здесь является if(this.state.submitted==false)
часть (я хочу, чтобы эти div
элементы отображались, когда заданная переменная установлена в false
).
Но при запуске этого я получаю ошибку в вопросе:
Uncaught Error: Parse Error: Строка 38: Соседние элементы JSX должны быть заключены в тег
В чем здесь проблема? И что я могу использовать, чтобы сделать эту работу?
javascript
reactjs
render
user1072337
источник
источник
Ответы:
Вы должны поместить свой компонент между тегом, который означает:
Вместо:
Редактировать: комментарий Per Joe Clay об API Fragments
источник
Уже поздно отвечать на этот вопрос, но я подумал, что это добавит объяснения.
Это происходит потому, что в любом месте вашего кода вы возвращаете два элемента одновременно.
например
Он должен быть обернут в родительский элемент. например
Более подробное объяснение
Ваш
jsx
код ниже преобразуетсяв это
Но если вы сделаете это
это преобразуется в это (только для иллюстрации, на самом деле вы получите
error : Adjacent JSX elements must be wrapped in an enclosing tag
)В приведенном выше коде вы можете видеть, что вы пытаетесь дважды вернуться из вызова метода, что, очевидно, неправильно.
Edit- Последние изменения в React 16 и собственных подопечных:
Если вы не хотите добавлять дополнительный div для переноса и хотите вернуть более одного дочернего компонента, вы можете использовать его
React.Fragments
.React.Fragments
немного быстрее и потребляет меньше памяти (не нужно создавать дополнительный узел DOM, меньше загроможденного дерева DOM).например (в Реакте 16.2.0)
или
или
источник
Элемент React должен возвращать только один элемент. Вам придется обернуть оба тега другим тегом элемента.
Я также вижу, что ваша функция рендеринга ничего не возвращает. Вот как должен выглядеть ваш компонент:
Также обратите внимание, что вы не можете использовать
if
операторы внутри возвращаемого элемента:источник
Если вы не хотите заключать его в другой div, как предлагали другие ответы, вы также можете заключить его в массив, и он будет работать.
Это можно записать как:
Обратите внимание, что выше будет выдано предупреждение:
Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method of 'YourComponent'.
Это можно исправить, добавив
key
атрибут к компонентам, если добавить их вручную, например:Вот еще немного информации о ключах: Состав против Наследования
источник
Проблема
Это означает, что вы пытаетесь вернуть несколько родственных элементов JSX неправильным образом. Помните, что вы пишете не HTML, а JSX! Ваш код переносится из JSX в JavaScript. Например:
будет перенесено в:
Если вы не новичок в программировании в целом, вы уже знаете, что функции / методы (любого языка) принимают любое количество параметров, но всегда возвращают только одно значение. Учитывая это, вы, вероятно, можете увидеть, что проблема возникает при попытке вернуть несколько родственных компонентов в зависимости от того, как
createElement()
работает; он принимает параметры только для одного элемента и возвращает его. Следовательно, мы не можем вернуть несколько элементов из одного вызова функции.Так что, если вы когда-нибудь задумывались, почему это работает ...
но не это ...
это потому , что в первом фрагменте, оба
<p>
-элементов являются частьюchildren
в<div>
-элементе. Когда они являются частьюchildren
тогда, мы можем выразить неограниченное количество родственных элементов. Посмотрите, как это будет происходить:Решения
В зависимости от того, какую версию React вы используете, у вас есть несколько вариантов решения этой проблемы:
Используйте фрагменты (только React v16.2 +!)
Начиная с React v16.2, React поддерживает фрагменты, которые являются компонентом без узла, который возвращает свои дочерние элементы напрямую.
Возвращение потомков в массиве (см. Ниже) имеет некоторые недостатки:
Они исключены из использования фрагментов. Вот пример детей, завернутых во фрагмент:
который удаляет сахар в:
Обратите внимание, что для первого фрагмента требуется Babel v7.0 или выше.
Вернуть массив (только React v16.0 +!)
Начиная с React v16, компоненты React могут возвращать массивы. В отличие от более ранних версий React, где вы были вынуждены обернуть все дочерние компоненты в родительский компонент.
Другими словами, теперь вы можете сделать:
это превращается в:
Обратите внимание, что выше возвращает массив. Массивы являются действительными элементами React начиная с версии 16 React и более поздних. Для более ранних версий React массивы не являются допустимыми объектами возврата!
Также обратите внимание, что следующее недопустимо (вы должны вернуть массив):
Обернуть элементы в родительский элемент
Другое решение включает в себя создание родительского компонента, который оборачивает в него дочерние компоненты
children
. На сегодняшний день это наиболее распространенный способ решения этой проблемы, который работает во всех версиях React.Примечание. Посмотрите снова на верхнюю часть этого ответа, чтобы узнать подробности и узнать, как это происходит .
источник
v16.4
первый пример не работает с использованием:,<>
only<React.Fragment>
:(Реакт 16.0.0 мы можем вернуть несколько компонентов рендеринга в виде массива.
Реагируя на 16.4.0, мы можем вернуть несколько компонентов рендера в теге Fragment. Фрагмент
Будущее реагирует, вы сможете использовать этот сокращенный синтаксис. (многие инструменты еще не поддерживают его, поэтому вы можете явно писать,
<Fragment>
пока инструмент не догонит.)источник
,
между компонентами. Это массив, поэтому вам нужно отделить каждый элемент внутри него.<Fragment>
, это<React.Fragment>
. так сказано в вашей собственной ссылкеimport React { Fragment } from 'react';
то вы используете это так<Fragment >
Если вы не заверните свой компонент, то вы можете написать его, как указано ниже метод.
Вместо:
Вы можете написать это:
источник
это очень просто, мы можем использовать родительский элемент div, чтобы обернуть все элементы, или мы можем использовать концепцию компонента высшего порядка (HOC's), то есть очень полезную для приложений реагировать js
или другой лучший способ - это HOC, это очень просто, не очень сложно, просто добавьте файл hoc.js в ваш проект и просто добавьте эти коды
Теперь импортируйте файл hoc.js, куда вы хотите использовать, теперь вместо переноса с элементом div мы можем переносить с помощью hoc.
источник
В реакции есть правило, что у выражения JSX должен быть ровно один самый внешний элемент.
неправильно
правильный
источник
React 16 получает ваш возврат в виде массива, поэтому он должен быть заключен в один элемент, например, div.
Неправильный подход
Правильный подход (все элементы в одном div или другом элементе, который вы используете)
источник
Реактивные компоненты должны быть упакованы в один контейнер, который может быть любым тегом, например "<div> .. </ div>"
Вы можете проверить метод визуализации ReactCSSTransitionGroup
источник
Импортировать вид и упаковывать
View
. Упаковка вdiv
не работала для меня.источник
View
самом деле это не лучшее решение.Неверно: не только дочерние элементы
Действительный: корневой элемент под дочерними элементами
источник
Для разработчиков Rect-Native. Я сталкиваюсь с этой ошибкой при рендеринге элемента в FlatList. У меня было два текстовых компонента. Я использовал их, как показано ниже
Но после того, как я положил эти буксирные компоненты Inside View, у меня все заработало
Возможно, вы используете другие компоненты, но их установка в View может быть вам полезна.
источник
View
самом деле это не лучшее решение.Я думаю, что осложнение также может возникнуть при попытке вложить несколько Div в оператор return. Вы можете сделать это, чтобы ваши компоненты отображались как блочные элементы.
Вот пример правильного рендеринга нескольких компонентов с использованием нескольких элементов div.
источник
У меня была проблема, которая вызвала эту ошибку, которая не была очевидна.
И здесь было исправление ...
Пойди разберись. Информация предоставлена здесь на случай, если другие столкнутся с этим ударом. Очевидно, вы не можете иметь имя класса элемента, совпадающее с именем его родительской функции React.
источник