Я возиться с React.js в первый раз и не могу найти способ показать или скрыть что-то на странице с помощью события клика. Я не загружаю никакую другую библиотеку на страницу, поэтому я ищу какой-то собственный способ использования библиотеки React. Это то, что я до сих пор. Я хотел бы показать результаты div, когда срабатывает событие click.
var Search= React.createClass({
handleClick: function (event) {
console.log(this.prop);
},
render: function () {
return (
<div className="date-range">
<input type="submit" value="Search" onClick={this.handleClick} />
</div>
);
}
});
var Results = React.createClass({
render: function () {
return (
<div id="results" className="search-results">
Some Results
</div>
);
}
});
React.renderComponent(<Search /> , document.body);
javascript
reactjs
user1725382
источник
источник
Ответы:
Реакция около 2020 года
В
onClick
обратном вызове позвоните государственном крюке функции сеттера для обновления состояния и повторной визуализация:JSFiddle
Реакция около 2014
Ключ должен обновить состояние компонента в обработчике кликов, используя
setState
. Когда изменения состояния применяются,render
метод вызывается снова с новым состоянием:JSFiddle
источник
источник
Вот альтернативный синтаксис для троичного оператора:
эквивалентно:
Почему
Также альтернативный синтаксис с
display: 'none';
Однако, если вы злоупотребляете
display: 'none'
, это приводит к загрязнению DOM и в конечном итоге замедляет работу вашего приложения.источник
Вот мой подход.
В приведенном выше коде, чтобы достичь этого, я использую такой код:
Это будет отображаться,
SomeElement
только еслиopened
это правда. Это работает из-за способа, которым JavaScript разрешает логические условия:Причины использования этого подхода вместо CSS «display: none»;
<TabView>
) изменится - даже если вы видите только одну вкладку, все 5 вкладок будут перерисованыdisplay: invisible ? 'block' : 'none'
что может нарушить компоновкуsomeBoolean && <SomeNode />
очень просто для понимания и рассуждений, особенно если ваша логика, связанная с отображением чего-либо или нет, становится сложнойисточник
this.setState({isOpened: !isOpened});
. Не зависит от самого государства, когда вы изменяете состояние. Вот хороший пример: reactjs.org/docs/... Так оно и должно быть:this.setState( s => ({isOpened: !s.isOpened}) )
. Обратите внимание на функцию стрелки внутри setState.с самой последней версией 0.11 вы также можете просто вернуть null, чтобы контент не отображался.
Рендеринг в ноль
источник
Я создал небольшой компонент, который обрабатывает это для вас: Reaction-toggle-display
Он устанавливает атрибут стиля на
display: none !important
основеhide
илиshow
реквизита.Пример использования:
источник
Уже есть несколько хороших ответов, но я не думаю, что они были объяснены очень хорошо, и некоторые из приведенных методов содержат некоторые ошибки, которые могут сбить людей с толку. Итак, я собираюсь перейти к трем основным способам (плюс один не по теме), чтобы сделать это, и объяснить плюсы и минусы. Я в основном пишу это, потому что вариант 1 был рекомендован, и есть много потенциальных проблем с этим вариантом, если он не используется правильно.
Вариант 1: условный рендеринг в родительском.
Мне не нравится этот метод, если только вы не собираетесь визуализировать компонент один раз и оставить его там. Проблема заключается в том, что каждый раз при переключении видимости вы будете реагировать на создание компонента с нуля. Вот пример. LogoutButton или LoginButton условно отображаются в родительском LoginControl. Если вы запустите это, вы заметите, что конструктор вызывается при каждом нажатии кнопки. https://codepen.io/Kelnor/pen/LzPdpN?editors=1111
Теперь React довольно быстро создает компоненты с нуля. Тем не менее, он все равно должен вызывать ваш код при его создании. Так что если ваш конструктор, componentDidMount, рендер и т. Д. Код дорогой, то он будет значительно замедлять показ компонента. Это также означает, что вы не можете использовать это с компонентами с состоянием, где вы хотите, чтобы состояние сохранялось при скрытии (и восстанавливалось при отображении.) Одно преимущество заключается в том, что скрытый компонент вообще не создается до тех пор, пока он не выбран. Таким образом, скрытые компоненты не будут задерживать вашу начальную загрузку страницы. Также могут быть случаи, когда вы хотите, чтобы компонент с состоянием сбрасывался при переключении. В этом случае это ваш лучший вариант.
Вариант 2: условный рендеринг у ребенка
Это создает оба компонента один раз. Затем замыкает остальную часть кода рендеринга, если компонент скрыт. Вы также можете закоротить другую логику в других методах, используя видимую опору. Обратите внимание на файл console.log на странице кода. https://codepen.io/Kelnor/pen/YrKaWZ?editors=0011
Теперь, если логика инициализации быстрая, а дочерние элементы не сохраняют состояния, вы не увидите разницы в производительности или функциональности. Однако зачем в любом случае заставлять React создавать новый компонент, каждый раз переключаясь? Однако если инициализация стоит дорого, вариант 1 будет запускать ее каждый раз, когда вы переключаете компонент, что замедляет страницу при переключении. Вариант 2 будет запускать все компоненты компонента при первой загрузке страницы. Замедление первой загрузки. Должен заметить еще раз. Если вы просто показываете компонент один раз на основе условия, а не переключаете его, или вы хотите, чтобы он сбрасывался при переключении toggledm, тогда вариант 1 подойдет и, вероятно, будет лучшим вариантом.
Однако, если медленная загрузка страницы является проблемой, это означает, что у вас есть дорогой код в методе жизненного цикла, и это, как правило, не очень хорошая идея. Вы можете и, вероятно, должны решить проблему медленной загрузки страницы, удалив дорогой код из методов жизненного цикла. Переместите его в асинхронную функцию, которая запускается ComponentDidMount, и пусть обратный вызов помещает ее в переменную состояния с помощью setState (). Если переменная состояния равна нулю, а компонент видим, тогда пусть функция рендеринга возвращает заполнитель. В противном случае визуализируйте данные. Таким образом, страница будет загружаться быстро и заполнять вкладки по мере их загрузки. Вы также можете переместить логику в родительский элемент и передать результаты дочерним элементам в качестве реквизита. Таким образом, вы можете определить приоритетность вкладок, которые будут загружены первыми. Или кэшируйте результаты и запускайте логику только при первом показе компонента.
Вариант 3: скрытие класса
Скрытие классов, вероятно, проще всего реализовать. Как уже упоминалось, вы просто создаете класс CSS с display: none и назначаете класс на основе prop. Недостатком является то, что весь код каждого скрытого компонента вызывается, и все скрытые компоненты присоединяются к DOM. (Вариант 1 вообще не создает скрытых компонентов. А Вариант 2 замыкает ненужный код, когда компонент скрыт, и полностью удаляет компонент из DOM.) Кажется, это быстрее при переключении видимости в соответствии с некоторыми тестами, выполненными комментаторами на другие ответы, но я не могу говорить с этим.
Вариант 4: один компонент, но изменить реквизит. Или, может быть, нет компонента вообще и кешировать HTML.
Это не будет работать для каждого приложения, и это не по теме, потому что речь не идет о скрытии компонентов, но может быть лучшим решением для некоторых случаев использования, чем скрытие. Допустим, у вас есть вкладки. Может быть возможно написать один React Component и просто использовать реквизит, чтобы изменить то, что отображается на вкладке. Вы также можете сохранить JSX для переменных состояния и использовать опору, чтобы решить, какой JSX вернуть в функции рендеринга. Если JSX должен быть сгенерирован, тогда сделайте это и кешируйте его в родительском и отправьте правильный как опору. Или сгенерируйте в дочернем элементе и кэшируйте его в дочернем состоянии и используйте реквизиты для выбора активного.
источник
Это хороший способ использовать виртуальный DOM :
Пример здесь
Использование React-хуков:
Пример здесь
источник
this.setState()
должны зависеть от состояния в .Вы устанавливаете логическое значение в состоянии (например, 'show)', а затем делаете:
источник
Лучшие практики приведены ниже в соответствии с документацией:
Рендеринг элемента только тогда, когда состояние является действительным.
источник
источник
источник
Я начну с этого заявления от команды React:
По сути, вам нужно показать компонент при нажатии кнопки, вы можете сделать это двумя способами, используя чистый React или CSS, используя чистый React способ, вы можете сделать что-то вроде приведенного ниже кода в вашем случае, так что при первом запуске, результаты не отображаются как
hideResults
естьtrue
, но если нажать на кнопку, состояние изменится иhideResults
будет,false
и компонент будет визуализирован снова с новыми условиями значения, это очень распространенное использование изменения представления компонента в React ...Если вы хотите продолжить изучение условного рендеринга в React, посмотрите здесь .
источник
Простой пример скрытия / показа с React Hooks: (извините за отсутствие скрипки)
источник
Если вы хотите увидеть, как переключить отображение компонента, проверьте эту скрипку.
http://jsfiddle.net/mnoster/kb3gN/16387/
источник
Простой способ показать / скрыть элементы в React с использованием хуков
Теперь давайте добавим немного логики в наш метод рендеринга:
А также
Отличная работа.
источник
В некоторых случаях может быть полезен компонент более высокого порядка:
Создайте компонент более высокого порядка:
Расширьте свой собственный компонент:
Тогда вы можете использовать это так:
Это немного сокращает шаблон и обеспечивает соблюдение соглашений об именах, однако, пожалуйста, имейте в виду, что MyComp будет по-прежнему создаваться - способ опускания был упомянут ранее:
{ !hidden && <MyComp ... /> }
источник
Используйте модуль rc-if-else
источник
Одним из способов может быть использование React
ref
и управление классом CSS с помощью API браузера. Его преимущество заключается в том, чтобы избежать повторного рендеринга в React, если единственная цель - скрыть / показать какой-либо элемент DOM одним нажатием кнопки.PS Поправь меня, если я не прав. :)
источник
Если вы используете bootstrap 4, вы можете скрыть элемент таким образом
источник
Это также может быть достигнуто так (очень простой способ)
источник
В этом примере показано, как можно переключаться между компонентами с помощью переключателя, который переключается через каждые 1 с.
источник
Используйте этот простой и короткий синтаксис:
источник
Вот простое, эффективное и лучшее решение с Classless React Component для показа / скрытия элементов. Использование React-Hooks, которое доступно в последнем проекте create -act-app , использующем React 16
Удачного кодирования :)
источник
источник
Вы можете использовать файл CSS
и в файле CSS
источник
источник
источник
источник
const
вместо того,var
когда вы объявляете константы.