React使用过程中的坑

1.生命周期中需要注意的

componentWillMount

 如果React使用了服务端渲染时,该生命周期会在服务端和客户端分别调用一次,造成里面的代码逻辑重复执行。

render函数

render函数应该是个纯函数不应该有其他副作用比如setState()或者绑定事件,

原因如下

1)render函数在每次渲染时都会被调用,而setState会触发渲染会照成死循环。

2)而在render调用注册事件,每次组件一渲染就会调用注册事件

componentDidMount

componentDidMount在游览器端会在绘制真实dom之后调用,但在react native场景下componentDidMount受机器性能影响并不意味这真是的dom也绘制完成,视图很有可能还在绘制中。

2.更新阶段需要注意的

componentWillReceiveProps可被getPropsDriverState替代,另外getPropsDriverState存在时componentWillReceiveProps不会被调用。

什么时候会触发重新渲染,渲染中发生报错要怎么处理

1).函数组件

函数组件在任何时候都会重新渲染 ,但 官方提供了一种优化方式React.memo

2)class组件

不实现shouldComponentUpdate函数,有两种情况触发重新渲染

        (1)当state发生变化时

        (2)当props重新传入时候(无论props是否发生变化)

3)错误边界

错误边界是一种组件这种组件可以打印其子组件数任何位置的js的错误并且会渲染出备用UI

class ErrorBoundary extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            hasError: false
        }
    }
    static getDerivedStateFromError(error) {
        return {
            hasError: true
        }
    }
    componentDidCatch(error,errorInfo){
        //做一些错误日志例如上传到服务器
        logErrorToMyService(error,errorInfo)
    }
    render(){
        if(this.state.hasError){
            return <h1>Something went wrong</h1>
        }
        return <div>content</div>
    }
}

用了两个函数

getDerivedStateFromError用来处理当前的state状态,用于UI降级

componentDidCatch去捕获报错的具体类型,一般线上页面报错监控时候用到,渲染报错只能通过componentDidCatch捕获。

3.类组件和函数组件的区别

函数组件每一次执行都是一次全新函数的调用,会重新创建函数内部变量,内部函数等,由于js闭包机制的存在,这些变量会每个创建的函数作用域内单独维护,例如在更新前调用的setTimeout函数使用的变量如props是更新前函数作用域的。组件更新之后的props值又是一个新的函数作用域并不会影响会影响更新之前调用setTimeout函数中props变量的值

类组件每次更新并不会创建新的实例,组件事件函数调用this.state和this.props都是当前state和props是什么值那就是什么值,不存在像函数组件那样的闭包效果。

上代码:

首先函数组件和类组件都设置一个延迟2秒的setTimeout,然后点击这个两个组件,同时我在两秒之类让父亲组件改变传入子组件的user属性

父组件:

 子组件:

函数组件

2秒后打印

类组件

4.React中Hook的使用限制

react不能在循环、条件或嵌套函数中调用hook。

只能在函数组件中调用hook。

5.useEffect和useLayoutEffect区别

大多数场景下可以直接使用useEffect但代码引起页面闪烁就推荐使用useLayoutEffect处理,简单老说就是如有直接操作Dom样式或者引起Dom样式更新的场景更推荐使用useLayoutEffect。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值