2021-08-09小记

react生命周期

  • 挂载阶段
    constructor() -----> 初始化构造函数
    static getDerivedStateFromProps() -------->计算属性,必须有返回值,如果没有则return null
    return出来的值会合并到state中
    render() ---------> 渲染函数
    componentDidMount() ---------- 组件挂载完毕执行

  • 更新阶段
    static getDerivedStateFromProps()
    shouldComponentUpdate() ------>如果return true则执行render,否则不执行render
    render()

  • 卸载阶段

    componentWillUnmount()
    在这里插入图片描述

react获取dom节点

  • react 15.8 版本之前

    ref属性写成字符串会导致内存泄露----->会导致节点的重复引用,而之前引用的节点无法解除引用,造成内存泄漏
    官方推荐使用一个函数,函数的参数是那个dom节点{this.dom = dom}

  • react 16.0 版本之后

    React.creatRef() 这个api操作dom

react性能优化

1、shouldComponentUpdate

​ 两个参数,1、nextProps;2、nextState

2、pureComponent(纯组件)和memo 阻止组件不必要的更新

​ pureComponent需要确保state为不可变量

​ pureComponent实现了shouldComponentUpdate的浅比较

​ memo,包裹函数组件,第二个参数(可选,省略则浅比较)是回调函数,函数有两个参数,prevProps和NextProps, 返回true,表示props相等,不更新,否则返回false,更新组件(和shouldComponentUpdate相反,因为比较的东西不 同)

3、immutable.js ====数据操作自动返回新对象,实现不可变量

react原理

  • vdom和diff算法===>patch函数(比对)和h函数(构建虚拟dom)

  • 合成事件 ========> 17.0之前document,之后root

  • setState和batchUpdate=====>异步同步,是否命中batchUpdate机制(可以被react管理就是异步,原生就是同步)(setState不可变量)

    transaction事物机制=====>
    -transaction.initialize()===>改isbatchUpdate为true
    -yourHandle()执行你的函数
    -transaction.close()===>改isbatchUpdate为false
    
  • 组件渲染过程------讲生命周期

  • react fiber
    组件渲染问题:js单线程,dom渲染共用,导致卡顿
    解决:reconciliation阶段进行任务拆分,dom需要渲染时暂停,空闲时间恢复
    使用的api window.requsetldleCallback()

  • 路由原理:三大路由:hash,history,memoryRouter ( X )

    hash

​ history

react不可变量

从React渲染组件性能考虑,使用旧数据创建新数据时,要保证旧数据同时可用,
并且没有变化的部分还可用,目的是尽量减少不必要的渲染和重绘。

如果是简单的赋值给一个新的变量,新旧对象只是名称不同,不进行深比较js认为数据不变。其次,也会带来引入对象浅拷贝的问题,造成不可预测的展示值。
这对react响应重新渲染造成了性能影响,或不能及时更新dom。

shouldComponentUpdate 是因为 state值和setState值一样是也会触发更新,但是只到浅比较,对于深层结构没有效率。
但是做深层拷贝很耗时,于是这才有了Immutable 不可变数据,来提升组件render的效率。

react 路由

react-router ----> react-router-dom

react-router-dom依赖于react-router

BrowserRouter(history路由)作为路由的外层包裹

Route作为显示组件的视图组件
1、方法一:component ==> 传入一个类型(即一个组件。可以是类组件,也可以是一个函数组件)
2、方法二:render ===> 传入一个回调函数,返回一个dom节点
3、方法三:children ==> 设置一个dom节点
Link(NavLink)作为跳转路由的链接

withRouter(高阶组件) ===> 调用withRouter(组件) 可以使组件的props中有路由的三个属性

三个属性:location、history、match

Switch--------> 类似分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值