【发布时间】:2020-12-27 08:14:48
【问题描述】:
好的,我遇到了一些我不太理解的行为。 我有这个 useState 钩子
const [permanent, setPermanent] = useState(false)
还有这个 useEffect 钩子
useEffect(() => {
if (permanent) {
dispatch({ value: 'Permanent booth', key: 'period' })
} else {
dispatch({ value: '0', key: 'period' })
}
}, [permanent])
它会在初始渲染时触发重新渲染,并且在渲染我的组件时我不会调用setPermanent,我已经通过评论我的应用程序中的每个setPermanent 调用来检查这一点。而且我还尝试将其替换为记录到控制台的函数。
//const [permanent, setPermanent] = useState(false)
const permanent = false
const setPermanent = () => {
console.log('I am called') //does not get called on initial render
}
我知道它会触发重新渲染,因为当我在其中注释第二个调度调用之一时,它不会触发重新渲染。
useEffect(() => {
if (permanent) {
dispatch({ value: 'Permanent booth', key: 'period' })
} else {
//dispatch({ value: '0', key: 'period' })
}
}, [permanent])
这是有原因的吗,因为我似乎找不到解释这种行为的文档?
编辑 --------------
const shopOptions = (() => {
const options = [
{ label: 'Choose a shop', value: '0' },
]
Object.keys(stores).forEach(store => {
options[options.length] = { label: store, value: options.length }
})
return options
})()
const genderOptions = [
{ label: 'Choose a gender', value: '0' },
{ label: 'Female', value: '1' },
{ label: 'Male', value: '2' }
]
const periodOptions = [
{ label: 'Choose a period', value: '0' },
{ label: '1 week', value: '1' },
{ label: '2 weeks', value: '2' },
{ label: '3 weeks', value: '3' },
{ label: '4 weeks', value: '4' }
]
const initialState = {
shop: shopOptions[0],
gender: genderOptions[0],
period: periodOptions[0],
}
function reducer(prevState, { value, key }) {
const updatedElement = { ...prevState[key] }
updatedElement.value = value
return { ...prevState, [key]: updatedElement }
}
//form
const [state, dispatch] = useReducer(reducer, initialState)
【问题讨论】:
-
调度是否做了会导致组件卸载和重新安装的事情? (例如,父母进入加载状态)。您可以返回一个清理函数,该函数仅将某些内容记录到控制台并在其中设置一个断点以查看当时发生了什么。 (由于组件和 React 的渲染过程之间存在抽象层和解耦,这并不像听起来那么简单。)
标签: javascript reactjs react-hooks state