常见错误解析

96 阅读2分钟

1. 如图,语义是hook只能在方法组价组件中使用,但是大多数的使用者,都不会这么做的吧。

image.png

所以这个提示不是表面看上去的这样,而是因为react版本问题,这也是我在自己开发组件库的时候碰到的。你所使用的第三方依赖中的react的版本和你项目的react版本有冲突,可以通过下面命令查看下问题产生的依赖。

npm ls react

很多情况下,这是因为npm安装的问题,改用pnpm或者yarn,此时问题神奇的解决了。主要还是因为npm装包依赖的问题,后续有机会单开篇解析npm,yarn等这些包管理工具工作时具体的步骤和原理。 可能性二:A库调用B,B使用的是npm link调试,会导致react的依赖出现两次,此时也会出现上述错误,解决方案可以是在B中link到A下面的react,重启项目或者

2. &&的使用

我们在很多场景都用到了&&,例如

list.length && <List></List>

这时候,如果list是空的话,我们预期肯定是不显示任何东西,但是实际上,会显示一个0,为什么呢。 算符返回从左到右计算时遇到的第一个假操作数的值,或者如果它们都是真值,则返回最后一个操作数的值。 这是mdn给的解释,也就是说

0 && 1 => 0
false && 1 => false

而在react中,false就不会去渲染了,而0就会被当成一个文字节点。 如果还碰到如上场景的话,可以使用三目,或者list.length>=1,此类可直接得出bool值的表达式。

3. 参数children的使用

const App = () => {
  const [ list, setList ] = React.useState([])

  return (
    <Container>
      {
        list.map((name) => {
          return <div className="name-item">{ name }</div>  
        })
      }
    </Container>
  )
}

上述代码,Container组件中的children参数不为空,而是一个空数组,表示你传入了东西,但是东西没有值,所以如果需要在Container中判断children有无,最好使用React.children.toArray(children).length进行判断,如果是

<Container>{1 > 2 && 'xx'} </Container>

里面children是false,同理,里面计算的值就是children的值。

4. 一个组件内,使用两个相同组件的挂载

const C = ({name})=>{
  useEffect(()=>{
    console.log('name', name)
    // 类似于didMount
  },[])
}
Const F = ()=>{
  const [x, setX] = useState(false);
  return <div>
    <button onClick={()=>setX(!x)}>change</button>
    {x?<C name="c1"/>:<C name="c2"/>}
  </div>
}

上面代码,打印只会执行一次(当然如果useEffect依赖里有name那另当别论),这是因为react把两个组件当成了一个,所以更换的时候没有执行重新加载和挂载。如果需要当成两个组件,那就需要每个使用的地方加上key。