【发布时间】:2022-01-12 09:45:39
【问题描述】:
我尝试创建自定义挂钩来验证我的输入。但是如果自定义钩子返回一个对象,它会在页面上的每次更改时重新创建
const useInput = (initialValue) => {
const [value, setValue] = useState(initialValue)
const [state, setState] = useState('')
return {value, state}
}
const user = useInput('')
这样我就可以使用
user.value
user.state
但如果页面上有多个输入,一个输入会触发所有其他输入重新创建
useEffect(() => {
console.log('This triggers on every change on the page')
}, [user])
但如果我先这样破坏它,那一切都很好
const {userValue, userState} = useInput('')
useEffect(() => {
console.log('Does not trigger on other inputs')
}, [userValue, userState])
或者,如果我使用 useMemo 返回对象,它也可以正常工作:
const useInput = (initialValue) => {
const [value, setValue] = useState(initialValue)
const [state, setState] = useState('')
const obj = useMemo(() => {
return {value, state}
}, [value, state])
return obj
}
const user = useInput('')
这是什么原因,为什么“用户”对象会发生变化,即使它没有变化,并且它在值上使用 useState。为什么在销毁或使用 useMemo 后停止重新创建?
我是 React 新手,并试图理解它。
【问题讨论】:
-
感谢您很好地解释了这个问题。你能创建一个分钟吗?代码沙箱中的复制示例?想查看其他输入以及您如何使用钩子
-
试试不要把
user放到useEefect deps中,而是把你要检查的属性放在里面? -
@NickParsons 谢谢!但是为什么破坏对象不会触发useEffect,即使没有useMemo()
标签: javascript reactjs react-hooks