Javascript 为什么布尔变量传递给useState()总是false?反应钩
我有一个简单的函数组件,希望根据条件使用布尔值初始化状态。例如:Javascript 为什么布尔变量传递给useState()总是false?反应钩,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我有一个简单的函数组件,希望根据条件使用布尔值初始化状态。例如: export default() => { const st = useSelector(state => state.body); const { type } = st; let bool = type === 'test' const [ hidden, setHidden ] = useState(bool) //this is always true } st只是从redux获取状态
export default() => {
const st = useSelector(state => state.body);
const { type } = st;
let bool = type === 'test'
const [ hidden, setHidden ] = useState(bool) //this is always true
}
st
只是从redux获取状态,type
将是条件。在某些情况下,type
将被测试,因此bool
将为true,但当它初始化状态时
总是false
我在useState
和hidden
显示false之后执行console.log
我不确定是什么导致了错误。我错过什么了吗?如你所说,我感谢你的帮助和见解
st正在从redux获取状态
这可能就是问题所在
可能在第一次渲染中,从redux获得的值不正确(可能是null
或undefined
),因此它将状态的默认值设置为false
,然后进行第二次渲染,返回正确的值,但不会将其重新指定给状态
useState
的默认值将仅在第一次渲染中设置,如果在第一次渲染中它不是您想要的,它将不会更改,除非您进行了设置
您可以使用useffect
hook在type
更改时重置hidden
export default () => {
const st = useSelector(state => state.body);
const { type } = st;
let bool = type === 'test';
const [ hidden, setHidden ] = useState(bool) //this is always true
// reset hidden if type changes
useEffect(() => {
setHidden(type === 'test')
}, [type])
}
bool
将设置为false,除非type===“test”
,而不知道type
是什么,这是预期的。这里唯一的错误是setHidden
不需要作为useffect()
的依赖项,因为React保证它保持不变。这没有错,如果您没有将setHidden
作为依赖项传递,eslint将给您一个警告。所以我补充说,这样人们就不会抱怨eslint了。你真的不需要它,但添加它并没有错。好吧,我错了。事实上,我的eslint没有抱怨。请参见此处的文档示例,setter不包括在依赖项列表中。@RichardMatsen ops,看起来我已经运行了旧版本的eslint