当前位置:   article > 正文

React---基础3(生命周期、axios)_react属于单页面开发

react属于单页面开发

十一、生命周期

<= v16.8.4

注意:

React 是单页面的,即所有组件都是在初始化创建的时候全部被创建的(包括弹框),只是通过属性来显示和隐藏组件,并不会销毁和重建组件。

因此,在子组件中,可以通过更新state时会触发的回调函数来做一些操作,如componentWillUpdate();但是若是在componentWillMount()做了一些操作的话,那么这些操作便只会触发一次,更新state或是显示出该组件(如弹框组件)时都不会触发这些操作,因为它们所在的回调函数在生命周期中只触发一次。

1. 组件的三个生命周期

Mount:插入真实DOM
Update:正在被重新渲染
Unmount:被移除真实DOM

2. React 为每个状态提供的勾子(hook)函数

componentWillMount()
componentDidMount()
componentWillUpdate()
componentDidUpdate()
componentWillUnmount()

3. 生命周期流程

1、初始化阶段: 由ReactDOM.render()触发---初次渲染

  • constructor():创建对象初始化 state
  • componentWillMount():将要插入回调
  • render():用于插入虚拟DOM回调–每更新一次状态,调用一次
  • componentDidMount():已经插入回调 =====> 常用,一般在这个钩子中做一些初始化的事,例如:开启定时器、发送网络请求、订阅消息

2、更新阶段: 由组件内部this.setSate()或父组件render触发

  • shouldComponentUpdate():return true; 控制组件更新的“阀门”
  • componentWillUpdate:将要更新回调

  • render():更新(重新渲染)=====> 必须使用的一个
  • componentDidUpdate():已经更新回调

3、移除/卸载组件:ReactDOM.unmountComponentAtNode(containerDOM)  =====> 常用,一般在这个钩子中做一些收尾的事,例如:关闭定时器、取消订阅消息

       

  • componentWillUnmount():组件将要被移除回调

  • initial render
  • constructor()
  • componentWillMount()
  • render()
  • componentDidMount()
  • componentWillUnmount()

  • 父组件 render
  • componentWillReceiveProps(props):组件将要接收到新属性,第一次接收属性的时候不调用
  • shouldComponentUpdate()–this.setState()
  • componentWillUpdate()–this.forceUpdate()
  • render()
  • componentDidUpdate()
  • componentWillUnmount()
  1. <div id="example">/<div>
  2. <script type="text/babel">
  3. class Life extends React.Component {
  4. constructor(props) {
  5. super(props)
  6. this.state = {
  7. opcity: 1
  8. }
  9. this.destroyComponent = this.destroyComponent.bind(this)
  10. }
  11. componentDidMount() {
  12. // 启动循环定时器
  13. this.intervalID = setInterval(function() {
  14. let {opcity} = this.state
  15. opcity -= 0.1
  16. if(opcity<=0) {
  17. opcity = 1
  18. }
  19. this.setState({opcity})
  20. }.bind(this),200) // 绑定this为当前react实例
  21. // 使用箭头函数解决this问题
  22. // setInterval(()=>{
  23. // this.setState({date: new Date()})
  24. // }, 1000)
  25. }
  26. // 销毁组件前
  27. componentWillUnmount() {
  28. clearInterval(this.intervalID) // 清理定时器,参数为定时器id
  29. }
  30. // 销毁组件Life
  31. destroyComponent() {
  32. ReactDOM.unmountComponentAtNode(document.getElementById('example'))
  33. }
  34. render() {
  35. const { opcity } = this.state
  36. return(
  37. <div>
  38. <h2 style={{opcity: opcity}}>{this.props.msg}</h2>
  39. <button @click="destroyComponent">销毁组件</button>
  40. </div>
  41. )
  42. }
  43. }
  44. ReactDOM.render(<Life msg="React生命周期"/>, document.getElementById('example'))
  45. </script>

重要的钩子

钩子作用
render()初始化渲染或更新渲染调用
componentDidMount()开启监听,可调用setTimeout, setInterval或者送 ajax 请求(初始化的异步操作)
componentWillUnmount()做一些收尾工作,如:清理定时器
componentWillReceiveProps()当组件接收到新的属性时回调

>= v17.0.1 

 新的与旧的相比:废弃了3个(componentWillMount、componentWillReceiveProps、componentWillUpdate),新增了2个(getDerivedStateFromProps、getSnapshotBeforeUpdate) 

  1. /*
  2. 1. 初始化阶段: 由ReactDOM.render()触发---初次渲染
  3. 1. constructor()
  4. 2. getDerivedStateFromProps
  5. 3. render()
  6. 4. componentDidMount() =====> 常用
  7. 一般在这个钩子中做一些初始化的事,例如:开启定时器、发送网络请求、订阅消息
  8. 2. 更新阶段: 由组件内部this.setSate()或父组件重新render触发
  9. 1. getDerivedStateFromProps
  10. 2. shouldComponentUpdate()
  11. 3. render()
  12. 4. getSnapshotBeforeUpdate
  13. 5. componentDidUpdate()
  14. 3. 卸载组件: 由ReactDOM.unmountComponentAtNode()触发
  15. 1. componentWillUnmount() =====> 常用
  16. 一般在这个钩子中做一些收尾的事,例如:关闭定时器、取消订阅消息
  17. */

十二、Axios 的使用

React 组件的数据可以通过 componentDidMount 方法中的 Ajax 来获取,当从服务端获取数据时可以将数据存储在 state 中,再用 this.setState 方法重新渲染 UI。

当使用异步加载数据时,在组件卸载前使用 componentWillUnmount 来取消未完成的请求。

1.安装:

npm isntall axios --save

2.在使用的组件中引入axios

import axios from 'axios';

案例:

  1. import React from 'react';
  2. import axios from 'axios';
  3. const url = 'https://5b5e71c98e9f160014b88cc9.mockapi.io/api/v1/lists';
  4. class UserGist extends React.Component {
  5. constructor(props) {
  6. super(props);
  7. this.state = { users: [] };
  8. }
  9. componentDidMount() {
  10. axios.get(url).then(res => {
  11. const result = res.data;
  12. this.setState({
  13. users: result
  14. })
  15. }).catch((err) => {
  16. console.log("请求数据失败!");
  17. })
  18. }
  19. render() {
  20. return (
  21. <div>
  22. <h1>Ajax</h1>
  23. <table>
  24. <tbody>
  25. {this.state.users.length > 0 &&
  26. this.state.users.slice(0,3).map((item, index) => {
  27. return (
  28. <tr key={index}>
  29. <td>{item.name}</td>
  30. <td>{item.sex}</td>
  31. <td>{item.age}</td>
  32. </tr>
  33. )
  34. })
  35. }
  36. </tbody>
  37. </table>
  38. </div>
  39. );
  40. }
  41. }
  42. export default UserGist;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/529665
推荐阅读
相关标签
  

闽ICP备14008679号