#reactjs
#reactjs
Вопрос:
У меня есть очень простой компонент, в котором я хотел бы отобразить ‘cookiePopup’ на основе того, является ли состояние ‘cookieShow’ истинным или ложным. Я бы хотел переключить состояние на false, нажав «контейнер закрытия cookie», тем самым удалив компонент. Это делается с помощью троичного оператора, который, если значение ‘cookieShow’ равно true, отобразит компонент, если оно равно false, вернет значение ‘null’.
Однако всякий раз, когда страница загружается, cookiePopup не отображается. Я думаю, это связано с моим троичным оператором, так как кажется, что это что-то простое, но я не могу в этом разобраться.
Вот мой код:
class CookiePopup extends Component {
constructor(props) {
super(props)
this.state = {
cookieShow: true
}
this.handleClick = this.handleClick.bind(this)
this.showCookiePopup = this.showCookiePopup.bind(this)
this.removeCookiePopup = this.removeCookiePopup.bind(this)
}
handleClick() {
this.setState(state => ({
cookieShow: false
}));
}
showCookiePopup() {
return (
<div className="cookie-popup-container">
<div onClick={this.handleClick} className="cookie-close-container">
<span className="cookie-close-span-1"></span>
<span className="cookie-close-span-2"></span>
</div>
<div className="cookie-text-container">
<p className="cookie-text">By using our website, you agree to our <a class="cookie-link" href="/cookies" target="_self">cookies</a> policy.</p>
</div>
</div>
)
}
removeCookiePopup() {
return (
null
)
}
render() {
return (
<div>
{ this.state.cookieShow ? this.showCookiePopup : this.removeCookiePopup }
</div>
)
}
}
Не уверен, что я делаю не так, но буду признателен за любые советы! Спасибо.
Ответ №1:
Попробуйте это
{ this.state.cookieShow ? this.showCookiePopup() : this.removeCookiePopup() }
Комментарии:
1. Самое простое решение! Как я это пропустил. Спасибо, ценю ответ!
2. Да, просто не могу принять его до 15 минут после публикации вопроса.
Ответ №2:
Что касается проблемы с рендерингом, я бы сказал, это потому, что вы не выполняете функции в своем троичном, попробуйте добавить скобку следующим образом :
{ this.state.cookieShow? this.showCookiePopup() : this.removeCookiePopup() }
Следующее не вызывает ваших проблем, но вы могли бы лучше кодировать :
-
Вам не нужно привязывать свои методы в конструкторе, если вы используете функции со стрелками, например :
removeCookiePopup = () => { // TODO }
-
Я не уверен в том, как вы написали свой setState, если кто-то еще может подтвердить, что это правильный способ его записи? В любом случае, обычно мы пишем это так :
this.setState({cookieShow: false });
Или, что еще лучше, вы можете использовать предыдущее значение состояния, поскольку React заявляет, что это правильный путь (https://reactjs.org/docs/state-and-lifecycle.html ), вот так :
this.setState((previousState) => ({ cookieShow: !previousState.cookieShow}) );
который будет переключать ваш модальный между true и false, что означает, что вам нужен только один метод для его открытия и закрытия.
Комментарии:
1. Спасибо за отзыв. Согласен с привязкой, это неприятно и не нужно, но именно так написана остальная часть приложения, поэтому планируйте изменить это в будущем, когда я переработаю код. Пока просто сосредоточьтесь на рабочем приложении. 🙂 Для второй части — setState на самом деле таково, как оно задокументировано в документах React: reactjs.org/docs/handling-events.html — Я знаю, что есть более эффективный способ написать это, просто сейчас сосредоточьтесь на том, чтобы все это работало. Последний бит о предыдущем значении полезен! Я еще немного почитаю об этом, поскольку я никогда им не пользовался. Спасибо за ответ!
2. И спасибо за ваше! Я заметил, что последняя часть о предыдущем значении — это именно то, что вы сделали, я был потерян из-за состояния именования. Это именно то, что вы сделали, не обращайте на меня внимания! Хорошего дня