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