React 功能组件不会随着值的改变而改变
React functional component does not change as soon as value changes
我为重置密码页面制作了一个反应组件。重置令牌发送到用户邮箱后,重置页面有三个输入:令牌、新密码和确认密码。后两者是隐藏的,直到在令牌字段中输入 sha256 token
,此时密码字段出现,令牌字段消失。这曾经有效,直到我在重置 URL 中也转发了带有重置令牌的 URL。因此,我还必须在我的 useEffect()
中添加 compShow()
函数,以便在加载组件后立即检查令牌并更新令牌字段,使其不可见。这在带有重置令牌的 URL 中有效,但没有重置的 URL 应该首先仅显示令牌字段,然后隐藏令牌并显示密码字段现在无法按预期工作。只有当我在输入令牌后按下一个额外的字符时,令牌字段才会消失(我使用 space)。我认为这是因为我第一次在 onChangedHandler
函数中更改 placeholder
状态变量的值时, compShow()
不会被触发。但是当我添加一个额外的字符时,compShow
函数检测到 placeholder
中的变化并执行其相应的代码。
谁能告诉我为什么会这样,我应该怎么做才能得到预期的结果?
下面提供了代码片段
const [placeholder, setPlaceholder] = useState('')
const { onReleaseError, onError } = props
const compShow = useCallback(() => {
if (validator.isHash(placeholder, 'sha256')) {
setShowToken({ display: 'none' })
setShow(style.show)
setErrorType('red')
onReleaseError()
}
}, [placeholder, onReleaseError])
useEffect(() => {
const path = new URL(document.location).pathname.split('/')[2] || null
if (path) {
setPlaceholder(path)
compShow()
} else {
setErr(onError)
if (onError) setErrorType('green')
}
}, [compShow, onError])
const onChangeHandler = e => {
setPlaceholder(e.target.value)
compShow()
}
显然,解决方案要简单得多。 useCallback
锁定它在组件渲染/更新开始时采用的值。组件开头定义的 placeholder
是一个空字符串,因此在我们调用 compShow
函数时它不会改变。但是当我接受一个可能是也可能不是 placeholder
但具有相同值的输入时,compShow
函数采用 placeholder
的更新值并按预期运行。
const [placeholder, setPlaceholder] = useState('')
const { onReleaseError, onError } = props
const compShow = useCallback(
val => {
if (validator.isHash(val, 'sha256')) {
setShowToken({ display: 'none' })
setShow(style.show)
setErrorType('red')
onReleaseError()
}
},
[onReleaseError]
)
useEffect(() => {
const path = new URL(document.location).pathname.split('/')[2] || null
if (path) {
setPlaceholder(path)
compShow(path)
} else {
setErr(onError)
if (onError) setErrorType('green')
}
}, [compShow, onError])
const onChangeHandler = e => {
setPlaceholder(e.target.value)
compShow(e.target.value)
}
我为重置密码页面制作了一个反应组件。重置令牌发送到用户邮箱后,重置页面有三个输入:令牌、新密码和确认密码。后两者是隐藏的,直到在令牌字段中输入 sha256 token
,此时密码字段出现,令牌字段消失。这曾经有效,直到我在重置 URL 中也转发了带有重置令牌的 URL。因此,我还必须在我的 useEffect()
中添加 compShow()
函数,以便在加载组件后立即检查令牌并更新令牌字段,使其不可见。这在带有重置令牌的 URL 中有效,但没有重置的 URL 应该首先仅显示令牌字段,然后隐藏令牌并显示密码字段现在无法按预期工作。只有当我在输入令牌后按下一个额外的字符时,令牌字段才会消失(我使用 space)。我认为这是因为我第一次在 onChangedHandler
函数中更改 placeholder
状态变量的值时, compShow()
不会被触发。但是当我添加一个额外的字符时,compShow
函数检测到 placeholder
中的变化并执行其相应的代码。
谁能告诉我为什么会这样,我应该怎么做才能得到预期的结果?
下面提供了代码片段
const [placeholder, setPlaceholder] = useState('')
const { onReleaseError, onError } = props
const compShow = useCallback(() => {
if (validator.isHash(placeholder, 'sha256')) {
setShowToken({ display: 'none' })
setShow(style.show)
setErrorType('red')
onReleaseError()
}
}, [placeholder, onReleaseError])
useEffect(() => {
const path = new URL(document.location).pathname.split('/')[2] || null
if (path) {
setPlaceholder(path)
compShow()
} else {
setErr(onError)
if (onError) setErrorType('green')
}
}, [compShow, onError])
const onChangeHandler = e => {
setPlaceholder(e.target.value)
compShow()
}
显然,解决方案要简单得多。 useCallback
锁定它在组件渲染/更新开始时采用的值。组件开头定义的 placeholder
是一个空字符串,因此在我们调用 compShow
函数时它不会改变。但是当我接受一个可能是也可能不是 placeholder
但具有相同值的输入时,compShow
函数采用 placeholder
的更新值并按预期运行。
const [placeholder, setPlaceholder] = useState('')
const { onReleaseError, onError } = props
const compShow = useCallback(
val => {
if (validator.isHash(val, 'sha256')) {
setShowToken({ display: 'none' })
setShow(style.show)
setErrorType('red')
onReleaseError()
}
},
[onReleaseError]
)
useEffect(() => {
const path = new URL(document.location).pathname.split('/')[2] || null
if (path) {
setPlaceholder(path)
compShow(path)
} else {
setErr(onError)
if (onError) setErrorType('green')
}
}, [compShow, onError])
const onChangeHandler = e => {
setPlaceholder(e.target.value)
compShow(e.target.value)
}