Дополнительно
Показать или скрыть элемент в React
Я впервые работаю с React.js и не могу найти способ показать или скрыть что-то на странице через событие click. Я не загружаю на страницу никакие другие библиотеки, поэтому я ищу какой-то нативный способ с использованием библиотеки 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);
453
20
Ключевым моментом является обновление состояния компонента в обработчике клика с помощью
setState
. Когда изменения состояния будут применены, методrender
будет вызван снова с новым состоянием:[JSFiddle][1]
Вот альтернативный синтаксис тернарного оператора:
эквивалентно:
Худой почему
Также альтернативный синтаксис с
дисплей: 'Нет';
Однако, если вы злоупотребляете
дисплей: 'Нет'
, это приводит к загрязнению дом и в конечном итоге замедляет приложение.Вот мой подход, используя ЕС6. В то время как принятый ответ правильный, он'ы довольно устарели.
Демо: http://jsfiddle.net/kb3gN/16688/
Это's лучше, чтобы представить некоторый элемент только в случае необходимости, нежели добавив некоторые классы CSS с
дисплей: нет. Если вы установите
дисплей: нет` - элемента, оказываемых реагировать и добавил в " дом " - это может плохо сказаться на производительности.Представьте, что у вас есть страница с вкладками, где каждая вкладка имеет много контента и, где только 1 вкладка открывается сразу. Это'ы гораздо лучше держать в " дом " только те элементы, которые должны быть отображены.
В выше код, чтобы добиться этого, я'м, используя следующий код:
Что сделает
SomeElement
только еслиоткрыт
истинно. Это работает, потому как на JavaScript решения логических условий:с новейшей версией реагировать 0.11 вы также можете просто вернуть null, чтобы не содержимое представленное.
Оказывая в Null
Я создал небольшой компонент, который обрабатывает это для вас: реагирую-переключение-дисплей
Он устанавливает атрибут стиля `дисплей: нет !важно на основе реквизит "скрыть" или "показать".
Пример использования:
в
Уже есть несколько ответов, но я Дон'т думаю, что они'вэ были очень хорошо объяснены и некоторые из приведенных методов содержит несколько подводных камней, которые могут сбить людей. Поэтому я'м собираюсь перейти на трех основных способов (плюс один не по теме вариант) для этого и объяснить плюсы и минусы. Я'м в основном пишу это, потому что Вариант 1 был рекомендован много и там'много потенциальных проблем с этим вариантом, если не используется правильно.
Вариант 1: условное отображение в родительской.
Я Дон'т нравится этот метод, если вы не'повторно только собирается оказать компонент один раз и оставить его там. Вопрос это вызовет реагировать на создание компонента с нуля каждый раз, когда вы переключаться между режимами отображения. Здесь'ы например. LogoutButton или LoginButton были условно трактованные в Родительском LoginControl. Если вы выполните это, вы'МР видеть конструктор вызывается на каждой кнопке мыши. https://codepen.io/Kelnor/pen/LzPdpN?editors=1111
Сейчас реагируют довольно быстро на создание компонентов с нуля. Однако, его все равно придется называть код при ее создании. Так что если ваш конструктор, componentDidMount, визуализации и т. д. код-это дорого, то это'Лл существенно замедлить отображения компонента. Это также означает, что вы не можете использовать это с компонентами состояния, где вы хотите, чтобы государство было сохранено, когда скрытые (и восстановлена, когда появится.) Одно из преимуществ заключается в том, что скрытый компонент это'т на всех, пока он'ы выбрали. Так что скрытые компоненты выиграл't задержка вашей начальной странице загрузки. Там также может быть случаи, когда вы хотите, чтобы компонент состояния сброса при включении. В этом случае это оптимальный вариант.
Вариант 2: условное отображение в ребенка
Это создает сразу оба компонента. Затем коротких замыканий остальной код render, если компонент будет скрыт. Вы также можете короткое замыкание другой логики в использовании других методов видимой опоры. Обратите внимание на консоли.войдите в страницу сайт CodePen. https://codepen.io/Kelnor/pen/YrKaWZ?editors=0011
Теперь, если по логике инициализации быстрая и детей без гражданства, то вы выиграли'т вижу разницы в производительности или функциональных возможностей. Однако, зачем реагировать в любом случае создать новый компонент абсолютно каждый тумблер? Если же инициализация дорого, Вариант 1 будет выполняться каждый раз, когда вы переключаетесь компонент, который будет тормозить страницу вниз при переключении. Вариант 2 будет работать весь компонент'ы иниц при первой загрузке страницы. Замедляется, что в первую нагрузка. Следует еще раз отметить. Если вы're просто показывая компонента один раз в зависимости от условия и не переключение его, или вы хотите его сбросить, когда toggledm, то Вариант 1-это прекрасно и, вероятно, лучший вариант.
Однако, если замедление загрузки страницы является проблемой, это означает, что вы've получили дорогостоящее код в методе жизненного цикла и что'ы вообще не очень хорошая идея. Можно, и наверное нужно, решить медленной загрузки страницы, перемещая дорогостоящее код из методов жизненного цикла. Переместить его в асинхронной функции, что'ы скинула ComponentDidMount и обратный вызов, положил его в переменной состояния при выполнении функция setState(). Если государство переменная имеет значение null, и компонент виден, то есть функция визуализации вернуть заполнитель. В противном случае отображения данных. Таким образом, страницы будут быстро загружаться и заполнения вкладки во время загрузки. Вы также можете переместить логику в родительской и продвигать результаты для детей в качестве реквизита. Таким образом, вы можете определиться в том, какие вкладки загружаются в первую очередь. Или кэшировать результаты и работать только логика впервые показано компонент.
Вариант 3: Скрытие Класс
Прячась класс-это, пожалуй, самый простой в реализации. Как уже упоминалось, вы просто создать класс CSS с помощью display: none и присвоить класс на основе проп. Недостатком является весь код каждый скрытый компонент называется и все скрытые компоненты прикреплены к DOM. (Вариант 1 Не'т создать скрытые компоненты на всех. И Вариант 2 короткого замыкания, ненужного кода, когда компонент будет скрыт и удаляет компонент из Дом.) Оказывается, это быстрее в переключение видимости по несколько тестов сделано комментаторов на другие ответы, но я могу'т скажу.
Вариант 4: один компонент, а реквизит изменение. Или, может быть, ни один компонент на все и кэш в формате HTML.
Этот выиграл't работа для каждого приложения, и это'ы не по теме, потому что он's не о скрытии компонентов, но это может быть лучшим решением в некоторых случаях, чем прятаться. Позвольте'ы сказать, что у вас закладках. Можно написать один компонент реагировать и просто использовать реквизит, чтобы изменить то, что's, отображаемому в разделе. Вы также можете сохранить JSX для переменных состояния и использовать реквизит, чтобы решить, какие JSX, чтобы вернуться в функцию render. Если JSX должен генерироваться тогда сделай это и кэшировать его в родительской и отправить правильный один в качестве опоры. Или создать в детской и кэшировать его в ребенка'государство и использовать реквизит, чтобы выбрать активный.
Вы устанавливаете булево значение в состоянии (например, 'show)', а затем делаете:
Это хороший способ, чтобы использовать виртуальный дом:
`` класс переключение расширяет реагировать.Компонент { состояние = { показать: True, }
тумблер = () => В этом.выполнении функция setState((текущем состоянии currentstate) => ({- шоу: !текущем состоянии currentstate.показать}));
рендер() { возвращение ( <див> <кнопка функция onclick={этот.тумблер}> включено: {этот.государства.показать ? 'шоу' : 'скрыть'} < кнопка/> {этот.государства.шоу && <див>Привет</див>} </див> ); } } `` Пример здесь
Использование реагируют крючки:
`` константный тумблер = () => { константный [показать, toggleShow] = реагировать.useState(истина);
возвращение ( <див> кнопка < функция onclick={() => toggleShow(!шоу)}
Пример здесь
Рекомендуется ниже, в соответствии с документацией:
Отрисовки элемента только тогда, когда государство действует.
Я начинаю с этим заявление от команды реагирует:
Вы в основном должны показать компонент, когда кнопка будет нажата, вы можете сделать это двумя способами, с использованием чистого реагировать или с помощью CSS, с использованием чистого реагировать так, вы можете сделать что-то вроде ниже код в вашем случае, поэтому в первой гонке, результаты не отображаются как
hideResults
вtrue
, но при нажатии на кнопку, состояние изменится и hideResultsравно
false` и компонент визуализируется снова с новым значением условия, это очень часто используется для изменения вида компонента в реагируют...Если вы хотите сделать дальнейшие исследования в условное отображение в реагируют, смотрите здесь.
Если вы хотите, чтобы увидеть, как включить отображение компонента кассе эту скрипку.
http://jsfiddle.net/mnoster/kb3gN/16387/
В некоторых случаях более высоким компонентом порядке, могут быть полезными:
Создать более высокий компонент порядке:
Расширить свой собственный компонент:
Затем вы можете использовать его как это:
Это уменьшает немного шаблонный и принуждает придерживаться соглашения об именовании, однако следует помнить о том, что MyComp будут создается - способ опустить-это было сказано:
{ !скрытые && <MyComp ... /> }
Одним из способов может быть использование реагируют'ы
реф
и манипулировать CSS-класс с помощью браузера'ы по API. Его польза в том, чтобы избежать перерисовку в реакцию, если единственной целью является, чтобы скрыть/показать элемент какой-то дом на нажатие кнопки.ЗЫ поправьте меня, если я ошибаюсь. :)
Используйте РК-если-то модуль
Яш НПМ установки-сохранить РК-если-еще
``Яш импорт реагируют с 'реагировать'; импорт { если } с 'РК-если-то';
приложение класс расширяет реагировать.Компонент { рендер() { возвращение ( <если условие={этот.реквизит.showResult}> Некоторые Результаты </если> ); } } ``
Вот идет простой, эффективный и лучше всего с бесклассовым реагировать компонент для отображения/скрытия элементов. Использование реагировать-крюки, который доступен в последней версии создать-реагировать-приложение что реагировать 16
Удачи В Кодировании :)
Если вы используете бутстрап 4, Вы можете скрыть элемент этак
Это также может быть достигнуто такой (очень простой способ)
этот пример показывает, как вы можете переключиться между компонентами с помощью переключателя, который переключает через каждые 1сек