react报错解决 Rendered more fewer hooks than during the previous render

错误

  • 此次渲染比上次渲染多出了hook

错误实例代码

点击是否显示Son组件时候会报错

//父亲组件
const Father = (props) => {
    const [fatherState,setFatherState] =useState(false)
    return(
        <>
            <span onClick={()=>{setFatherState(!fatherState)}}>
                是否显示Son组件
            </span>
            {fatherState?Son():null}  //注意这里的子组件使用方法
        </>
    )
}

//子组件
const Son=()=>{
    const [sonState,setSonState] =useState(false)
    return(
        <>
            <span onClick={()=>{setSonState(!sonState)}}>
                点击显示/隐藏内容
            </span>
            {sonState?'---son的内容---':null}
        </>
    )
}

export default Father

错误产生的原因

  • 这里看到我调用Son组件是这样当做一个普通函数Son()进行调用而不是当做<Son/>组件进行调用
  • 且这个被当成普通函数使用的Son子组件内使用了react hook,示例中使用了useState

解决方法

使用标准的<Son/>即函数组件。
虽然使用Son()这种方法也是可以渲染,函数组件本来就是个函数,返回的的确是<>…</>也能被识别,但是你这当成普通函数用就不能在里面使用hook。
简单就是把函数组件当成普通函数去使用,渲染的时候react认为就是普通的函数违反了原则

  • 只在 React Functions 调用 Hooks
  • 不要在常规 JavaScript 函数(普通函数)中调用 Hook

同理另外个错误也是一样的道理

我把FatherState默认值改成true,点击是否显示Son组件时候不就Son消失了吗,Son的useState就没了。

const [fatherState,setFatherState] =useState(true)

在这里插入图片描述

Rendered fewer hooks than expected. This may be caused by an accidental early return statement.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值