react组件的生命周期以及基本语法

组件化的发展历程

面向对象:封装 集成 多态

模块化:13-16年 解决了全局变量和变量勿滥

组件化:使编程更轻量化

创建组件

组件的使用

  • 无需注册
  • 跟html标签书写一致
  • 首字母大写
  • 必须有根标签
  • 一个组件一个模块

组件生命周期钩子函数

从出生到成长,最后到死亡,这个过程的时间可以理解为生命周期。React的生命周期同理也是这么一个过程。
React的生命周期分为三个阶段:挂载期(也叫实例化期)、更新期(也叫存在期)、卸载期(也叫销毁期)。在每个周期中React都提供了一些钩子函数。
生命周期的描述如下:
挂载期:一个组件实例初次被创建的过程。
更新期:组件在创建后再次渲染的过程。
卸载期:组件在使用完后被销毁的过程。

那么钩子函数是什么呢?就是不同阶段要去做不同的事

 

初次挂载

constructor(构造函数,初始化状态值):组件第一次挂载被执行,只执行一次

componentWillMount(首次渲染前执行):react第一次挂载,在render之前,数据和模板进行拼接之前,render之前最后可以修改状态的机会,是数据最后可以修改的地方

render(渲染组件):数据和jsx拼接的地方,是纯函数,不做数据的存储与产生,制作数据的处理,每次props和state更新他都会重新渲染

componentDidMount(render渲染之后的操作):当组件真正的渲染到浏览器中去才执行且执行一次,放ajax请求。在终端运行 yarn add axios,插入import axios from 'axios',然后再componentDidMount里调用ajax请求

更新阶段

componentWillReceiveProps:父组件的数据传入子组件state的时候,父组件的改变会影响子组件的改变,该方法被调用

shuldComponentUpdate:当组件state或props的数据改变的时候,我们的组件要不要进行刷新,重新渲染,返回false会阻止render的调用

componentWillUpdate:更新阶段,数据和模板拼接之前,最后改变数据的一个地方

componentDidUpdate:更新阶段,最新的dom节点渲染到浏览器中

销毁之前

componentWillUnmount:解决一些事件的监听和释放dom操作,在删除组件之前进行清理操作,比如计时器和监听器。

老生命周期的问题

1.componentWillMount ,在ssr中 这个方法将会被多次调用, 所以会重复触发多遍,同时在这里如果绑定事件,将无法解绑,导致内存泄漏 , 变得不够安全高效逐步废弃。

2. componentWillReceiveProps 外部组件多次频繁更新传入多次不同的 props,会导致不必要的异步请求

3.componetWillupdate, 更新前记录 DOM 状态, 可能会做一些处理,与componentDidUpdate相隔时间如果过长,会导致状态不太好

新生命周期的代替

1.getDerivedStateFromProps 第一次的初始化组件以及后续的更新过程中(包括自身状态更新以及父传子) , 返回一个对象作为新的state,返回null则说明不需要在这里更新state

//老的生命周期的写法
componentDidMount() {
 if(this.props.value!==undefined){
 this.setState({
 current:this.props.value
        })
    }
}
componentWillReceiveProps(nextProps){
    if(nextProps.value !==undefined){
        this.setState({
            current:nextProps.value
        })
    }
}
//新的生命周期的写法
static getDerivedStateFromProps(nextProps) {
    if(nextProps.value!==undefined){
        return {
            current:nextProps.value
        }
    }
    return null
}

2.getSnapshotBeforeUpdate 取代了 componetWillUpdate ,触发时间为update发生的时候,在render之后 dom渲染之前返回一个值,作为componentDidUpdate的第三个参数。 

//新的数据不断插入数据前面, 导致我正在看的数据向下走,如何保持可视区依旧是我之前看的数据呢?
getSnapshotBeforeUpdate(){
    return this.refs.wrapper.scrollHeight
}

componentDidUpdate(prevProps, prevState,preHeight) {
    //if(preHeight===200)return ;
    this.refs.wrapper.scrollTop +=this.refs.wrapper.scrollHeight-preHeight
}

<div style={{height:"200px",overflow:"auto"}}} ref="wrapper">
    <ul>
        .........
    </ul>
</div>

react中性能优化的方案

1.shouldComponentUpdate

控制组件自身或者子组件是否需要更新,尤其在子组件非常多的情况下, 需要进行优化。

2.PureComponent

PureComponent会帮你 比较新props 跟 旧的props, 新的state和老的state(值相等,或者 对象含有相同的属性、且属性值相等 ),决定shouldcomponentUpdate 返回true 或者 false, 从而决定要不要呼叫 render function。

注意: 如果你的 state 或 props 『永远都会变』,那 PureComponent 并不会比较快,因为  shallowEqual 也需要花时间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章:React基础 1.react基础 2. JSX语法 3. 如何给组件添加样式 4. 如何添加自定义组件 5. 创建无状态组件 6. 学习render方法 7. 组件的属性 8. 组件的状态 9. 理解react中的this 10. 使用refs操作DOM元素 11. 子组件children属性 12. 组件生命周期之创建 13. 组件生命周期之销毁 14. 高阶组件 第二章: 使用React-router玩转路由管理 1. react路由介绍 2. 跑通基本的开发环境 3. 跑通基本路由 4. 使用Link组件进行导航切换 5. 路由的嵌套使用 6. 设置路由激活状态 7. 路由参数 8. 默认路由 9. indexlink 10. 路由重定向 11. browser history 12. webpack后端服务器 13. 路由切换 14. 钩子函数 15. 扩展内容 第三章:初入JS函数式编程的世界 1.什么是函数式编程 2. 函数式编程的好处 3. 函数是一等公民 4. 纯函数的作用 5. 柯里化函数 6. 函数组合 7. 高阶函数    第四章:深入浅出redux应用 1. Redux课程介绍 2.什么是Redux 3.搭建开发环境 4.理解action-store-reducer 5.理解dispatch 6.subscribe订阅 7.action-creator 8.react-redux介绍 9.实现计数器应用(1) 10.实现计数器应用(2) 11.实现计数器应用(3) 12.实现计数器应用(4) 13.Redux中间件(1) 14.Redux中间件(2) 15.Redux中间件(3) 16.Redux中间件(4) 17.logger中间件 18.thunk中间件实现异步action 19.超棒的调试工具 20.区分开发和生产环境 21.react-router-redux 22.中间件优化    第五章:使用React构建一个应用 1. 组件化思维解析应用功能 2. 跑通基本路由 3. 创建头部搜索组件 4. 封装展示用户信息的组件 5. state、props在传递数据的使用 6. 接入数据 7. 组件功能开发 8. PropTypes接口约束 9. 请求github API数据进行展示    第六章:最新React架构打造炫酷个人简历实战 01-整体项目介绍和内容分析 02-项目需求分析和组件化思考 03-跑通项目基础架构(一) 04-跑通项目基础架构(二) 05-目录规划指导并跑通第一个组件 06-添加container下各组件并跑通路由 07-react-addons-css-transition-group 08-NavMenu导航组件开发(一) 09-NavMenu导航组件开发(二) 10-NavMenu导航组件开发(三) 11-实现collapse折叠功能 12-实现路由激活状态的样式 13-目录层级调整 14-项目首页开发 15-About组件实现及样式优化 16-从业务过程到组件化思维的过渡 17-Skills组件开发 18-Project组件开发与Timeline的使用 19-Project组件和axios 20-Project组件样式开发 21-Contact组件开发(一) 22-Contact组件开发(二) 23-Contact组件开发(三)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值