#reactjs
#reactjs
Вопрос:
В reactjs, как я могу снова установить Notify состояние, которое находится на компоненте?
import React, { useState } from 'react'
const NotificationError = (props) => {
const [notify, setNotify] = useState(false);
// if (props.message === "") {
// props.message = "Some Error"
// }
// if (props.message !== "") {
// setNotify(false)
// }
// if (props) {
// const [notify] = useState(true)
// }
console.log("notify.state:", props)
const closeNotification = (e) => {
console.log("Should be closing notification")
setNotify(e)
}
return (
<div className="notification is-danger" style={notify ? {display: 'none'} : {display: 'block'}}>
<button className="delete" onClick={() => closeNotification(true)}></button>
Error: {props.message}
</div>
)
}
export default NotificationError
Если я использую следующее:
if (props) {
const [notify] = useState(true)
}
Я получаю сообщение об ошибке,
Строка 17:26: Хук реакции «useState» вызывается условно. Реагирующие хуки должны вызываться в том же порядке, что и в каждом компоненте, отображающем react-hooks / rules-of-hooks
Если я использую следующее
if (props.message !== "") {
setNotify(true)
}
Он выдает следующее…
Ошибка: слишком много повторных рендерингов. React ограничивает количество рендеров, чтобы предотвратить бесконечный цикл.
Просто я этого не понимаю. Не могли бы вы помочь? 🙁
Комментарии:
1. Вы не можете использовать useState условно. Для условий вы должны использовать эффект, и вы можете установить свое значение при изменении условия.
2. Я попытался, useEffect(() => { // const notify = useState(true) return () => { // Очистить уведомление о подписке.closeNotification(false); }; }, уведомить); но уведомление по-прежнему не отображается.
3. вы не можете определить useState в useEffect определить useState из useEffect и setState в useEffect условно.
Ответ №1:
Перепишите свою логику на что-то вроде:
const NotificationError = (props) => {
const [notify, setNotify] = useState(false);
useEffect(() => {
if (props.message === "") {
props.setMessage('Some Error');
}
setNotify(false);
}, [props.message]);
return (
<div
className="notification is-danger"
style={notify ? { display: "none" } : { display: "block" }}
>
<button className="delete" onClick={() => setNotify(true)}></button>
Error: {props.message}
</div>
);
};
Реквизиты неизменяемы, поэтому, если вы хотите изменить сообщение, вы должны передать обратный вызов.
Кроме того, ознакомьтесь с правилами перехватов.
Ответ №2:
Используйте useEffect
перехват для таких случаев. Он работает аналогично componentDidMount
и componentDidUpdate
в классе component. Это означает, что функция, которую вы передаете в качестве первого аргумента useEffect
hook, запускается в первый раз, когда ваш компонент монтируется, а затем каждый раз, когда изменяется какой-либо из элементов массива, который вы передаете в качестве второго аргумента.
Вот пример кода:
const NotificationError = (props) => {
const [notify, setNotify] = useState(false);
useEffect(() => {
if(props.message != '') {
setNotify(false);
}
}, [props.message])
const closeNotification = (e) => {
console.log("Should be closing notification")
setNotify(e)
}
return (
<div className="notification is-danger" style={notify ? {display: 'none'} : {display: 'block'}}>
<button className="delete" onClick={() => closeNotification(true)}></button>
Error: {props.message}
</div>
)
}