React技术栈系列—基础02---组件和生命周期

组件

坦白地说,学习一门技术或者某个框架,最好的资源是其官方文档,只是咱英文不好,看不懂呀,但也的看看呀。
Waht is Component?
Components let you split the UI into independent, reusable pieces, and think about eachpiece in isolation.

组件让你可以拆分UI为独立、可以被复用的单元,每个单元是独立的。

Conceptually, components are like JavaScript functions.
They accept arbitrary inputs(called "props") and return React elements describing what should appear on the screen.

概念上,组件和js的函数很像。它们接受参数(称为属性),然后返回你希望在屏幕上展示什么的东西。

Functional and Class Components

组件分为两种,叫做函数式组件和类组件。

The simplest way to define a component is to write a JavaScript function。

最简单的创建组件的方法,就是创建一个函数。

根据官网的说明,分别来说说函数式组件和类组件

函数式组件

import React from "react";
export default (props) => {
    return <h1>
        我是一个函数式组件,你传给我的a值是 {props.a}
    </h1>
}

官网又说了:

This function is a valid React component
because it accepts a single "props" objectargument with data
and returns a React element. We call such components "functional"because they are literally JavaScript functions.
这个函数是一个有效的、合法的React组件,因为它接受了一个参数props,并且返回了React Element。我们称之为“函数式的组件”,因为它就是一个函数。

我说点:
用函数来定义的组件没有state和生命周期的。用函数来定 义组件的情形,基本上就是想非常快的定义一个组件或者甚只是单纯的展示性组件并不涉及对于数据的更改。
Props are Read-Only--->props是只读的

类组件

import React from "react";
export default class MyCompo1 extends React.Component{
    constructor(){
        super();
    }
    render(){
        return (
            <div>
                <h1>我是组件</h1>
            </div>
        );
    }
}

类组件可以有自己的状态state和生命周期。类组件用于比较复杂的用户交互和后台通信数据。详细在后面介绍。

既然提到状态,就来说说组件的状态。

状态 --- state

Adding Local State to a Class
类定义的组件可以增加叫做Local State的状态
Class components should always call the base constructor with props.
类组件必须调用super(props).
比如:
import React from "react";
export default class MyCompo1 extends React.Component{
    constructor(props){
        super(props);
        this.state = {
            a : 100
        }
    }
    render(){
        return (
            <div>
                <h1>我是组件,a的值是{this.state.a}</h1>
            </div>);
        }
    }
}

Do Not Modify State Directly
不要直接改变状态

改变状态要使用setState()函数:

import React from "react";
export default class MyCompo1 extends React.Component{
    constructor(props){
        super(props);
        this.state = {
        a : 100 ,
        b : 666
        }
    }
    add(){
        this.setState({"a" : this.state.a + 1 })
    }
    render(){
        return (
            <div>
                <h1>我是组件,a的值是{this.state.a} , b的只是{this.state.b}</h1>
                <button onClick={this.add.bind(this)}>按我让state里面的a值加1</button>
            </div>
        );
    }
}

下面说说生命周期

生命周期

官网:

Each component has several "lifecycle methods" that you can override to run code atparticular times in the process.
每一个组件都有一些生命周期钩子,这些钩子你可以覆盖它,来在一些特殊的时候执行一些程序。
Methods   prefixed   with   will   are   called   right   before something   happens,
and   methodsprefixed with did are called right after something happens.will
前缀表示这一个时刻之前的那一瞬间,did前缀表示这一时刻之后的这一瞬间

生命周期又分为老版本的生命周期和16版本新的生命周期,以及各自的几个阶段:
老版本的:

Mounting阶段

These methods are called when an instance of a component is being created and insertedinto the DOM:
在一个组件被实例化的时候,正要添加到DOM树上的时候,有一些函数要被触发。
1)constructor(),
2)componentWillMount(),
3)render(),
4)componentDidMount()
书写位置的顺序与执行顺序无关。

执行如下:

Updating阶段

An update can be caused by changes to props or state. These methods are called when acomponent is being re-rendered。
props和state的改变会触发update。下面的方法会在视图要重绘的时候被调用。
1)componentWillReceiveProps(),

    componentWillReceiveProps() isinvoked before a mounted component receives newprops.
    If you need to update the state in response to prop changes (for example, toreset it),
    you may compare this.props and nextProps and perform state transitions usingthis.setState() in this method.
    这个 函数将会在组件接受到了新的props的时候  触发。此时提供了一个  参数 ,叫做nextProps,
    你可以利用它来比较最新参数和原来的参数的区别,来决定是否更改state

2)shouldComponentUpdate(),

    Use   shouldComponentUpdate()   to   let
    React   know   if   a   component's   output   is   notaffected by the current change in state or props.
    使用shouldComponentUpdate()函数  来让React知道  一个组件的视图  是不是   应该被   这次的state、props的改变而影响。
    The default behavior is to re-render on every state change,
    and in the vast majorityof cases you should rely on the default behavior.
    默认 的行为是:任何state的改变都会影响视图的更新, 并且 在绝大多数情况,你 应该 使用这个默认 的行为。
    shouldComponentUpdate() is invoked before rendering when new props or state arebeing received. Defaults to true.
    This method is not called for the initial render orwhen forceUpdate() is used.
    shouldComponentUpdate函数 在新的props或者新的state接受后,改变视图 前触发。
    通过true或者false来告诉React是不是要改变视图 。注意,初始的时候的render和使用forceUpdate()的时候,这个生命周期不会触发

3)componentWillUpdate(),

    componentWillUpdate()   is   invoked   immediately   before   rendering   when   new   props   orstate are being received.
    Use this as an opportunity to perform preparation before anupdate occurs. This method is not called for the initial render.
    componentWillUpdate()当props或者state改变的  瞬间触  发。这是一个在视图 改变之前做一些准备 的好时机。

4)render(),

    渲染视图,无须多说。

5)componentDidUpdate()

    componentDidUpdate() is invoked immediately after updating occurs.
    This method isnot called for the initial render.Use this as an opportunity to operate on the DOM whenthe component has been updated.
    This is also a good place to do network requests as longas you compare the current props to previous props (e.g. a network request may not benecessary if the props have not changed)
    componentDidUpdate这个 函数将  在视图更  新之后  立即触  发。这个方法在 初始render的时候不会触 发。这个函数是操作更新之后的DOM的好时机。这也是执行网络请求程序的好时机,因为你可以比较当前props 和之前的props

就不测试了,读者可以自行测试。

Unmounting阶段

此生命周期只有一个钩子函数,即:

componentWillUnmount()
    componentWillUnmount() is invoked immediately before a component is unmounted anddestroyed. Perform any necessary cleanup in this method, such as invalidating timers,canceling   network   requests,   or   cleaning   up   any   DOM   elements   that   were   created   incomponentDidMount
    componentWillUnmount()这个 函数 当组件要下树或者 销魂 的时候之前触发。这里可以写一些清理 的语 句,比如清除定时器、删除DOM元素 或者 等等 。在componentDidMount中创建的一些东东 ,此时要在componentWillUnmount()中销毁。
    

16版本新增

就不一一列举标题了:跟上面一样:

Mounting阶段:
constructor(),
static getDerivedStateFromProps(props, state),
    说明:组件每次被rerender的时候,包括在组件构建之后(虚拟dom之后,实际dom挂载之前),每次获取新的props或state之后;每次接收新的props之后都会返回一个对象作为新的state,返回null则说明不需要更新state;配合componentDidUpdate,可以覆盖componentWillReceiveProps的所有用法

render(),
componentDidMount()

Updating阶段
static getDerivedStateFromProps(props, state)
同上
shouldComponentUpdate(nextProps, nextState),
    组件接收到新的props或者state时调用,return true就会更新dom(使用diff算法更新),return false能阻止更新(不调用render)
render(),
etSnapshotBeforeUpdate(prevProps, prevState)
    触发时间: update发生的时候,在render之后,在组件dom渲染之前;返回一个值,作为componentDidUpdate的第三个参数;配合componentDidUpdate, 可以覆盖componentWillUpdate的所有用法
componentDidUpdate()
    组件加载时不调用,组件更新完成后调用

Unmounting阶段
componentWillUnmount()

Error Handling(错误处理)
componentDidCatch(error,info)
    任何一处的javascript报错会触发

大概先写这么多吧。欢迎批评和纠正

原文地址:https://www.cnblogs.com/tdd-qdkfgcs/p/11125681.html

时间: 2024-11-06 03:30:37

React技术栈系列—基础02---组件和生命周期的相关文章

React技术栈系列—基础01

React简介 于2013年来自Facebook开源项目. 和Angular不一样的是,React并不是一个完整的MVC/MVVM框架,它只专注于提供清晰.直接的View视图层解决方案.它的功能全部以构建组件视图为核心,并提供类似控制器的函数接口和生命周期函数.所以在React中么有控制器.没有服务.没有指令.没有过滤器等等这些. Virtual DOM 是React中的一个非常重要的概念,在日常开发中,前端需要将后端的数据呈现到界面中,同事还要能对用户的操作提供反馈,并且作用到UI上,这些操作

react.js 从零开始(二)组件的生命周期

什么是生命周期? 组件本质上是一个状态机,输入确定,输出一定确定. 当状态改变的时候 会触发不同的钩子函数,可以让开发者做出响应.. 一个组件的生命周期可以概括为 初始化:状态下 可以自定义的函数 getDefaultProps object getDefaultProps() 在组件类创建的时候调用一次,然后返回值被缓存下来.如果父组件没有指定 props 中的某个键,则此处返回的对象中的相应属性将会合并到 this.props (使用 in 检测属性). 该方法在任何实例创建之前调用,因此不

重谈react优势——react技术栈回顾

react刚刚推出的时候,讲react优势搜索结果是几十页. 现在,react已经慢慢退火,该用用react技术栈的已经使用上,填过多少坑,加过多少班,血泪控诉也不下千文. 今天,再谈一遍react优势,WTF? React的收益有哪些?React的优势是什么?react和vue.angularJS等其它框架对比优势? 而作为总结回顾.react在工程实践中,带来哪些思想上的质变? virtual dom虚拟DOM概念 它并不直接对DOM进行操作,引入了一个叫做virtual dom的概念,安插

如何从零学习 React 技术栈

达人课是GitChat的一款轻阅读产品,由特约讲师独家发布.每一个课程你都可获得6-12篇的深度文章,同时可在读者圈与讲师互动交流.GitChat达人课,让技术分享更简单. 如何从零学习 React 技术栈 余博伦 · 前端颜值担当 这里写图片描述 本课程共六篇文章 在学会 React 之后,你的能力将不止局限于浏览器,React 还可以拓宽到使用 React Native 开发原生应用,以及使用 ReactVR 开发虚拟现实等各个领域.除了示例代码的讲解之外,本课程还会对个别核心概念的原理进行

React组件的生命周期

整个组件,从创建组件类开始,到渲染,到消亡的过程,就是组件的生命周期. 组件的生命周期可以分为三个阶段: 挂载阶段 更新阶段 卸载阶段 挂载阶段 在这个过程中,会触发以下几个事件 getDefaultProps,设置默认属性 getInitialState,设置初始状态 componentWillMount 即将挂载 render 渲染,就是挂载 componentDidMount 挂载完成 <!DOCTYPE html> <html> <head> <meta

Android React Native组件的生命周期及回调函数

熟悉android的童鞋应该都清楚,android是有生命周期的,其很多组件也是有生命周期.今天小编和大家分享的React Native组件的生命周期,还不了解的童鞋,赶紧来围观吧 在android开发中,React Native组件的生命周期,大致分为三个阶段,分别是: 1.组件第一次绘制阶段,这个阶段主要是组件的加载和初始化: 2.组件在运行和交互阶段,这个阶段组件可以处理用户交互,或者接收事件更新界面: 3.组件卸载消亡的阶段,这个阶段主要是组件的清理工作. 在Android React

android四大基础组件--Service生命周期详解

android四大基础组件--ServiceService 生命周期详解 1.Service的生命周期: I> 在非绑定Service情况下,只有oncreate(),onStartCommand(),onDestory()方法情况下:  操作方法对应生命周期一: a.[执行startService(Intent)] 执行生命周期方法:oncreate()--->onStartCommand(): b.[执行stopService(Intent)] 执行生命周期方法:onDestory();

Android React Native组件的生命周期

和Android一样,React的组件也有对应的生命周期.Android React Native组件的生命周期可以总的概括为下面这一张图. 可以把组件生命周期大致分为三个阶段: 第一阶段:是组件第一次绘制阶段,如图中的上面虚线框内,在这里完成了组件的加载和初始化: 第二阶段:是组件在运行和交互阶段,如图中左下角虚线框,这个阶段组件可以处理用户交互,或者接收事件更新界面: 第三阶段:是组件卸载消亡的阶段,如图中右下角的虚线框中,这里做一些组件的清理工作. 生命周期回调函数总共有10个. obje

React Native组件、生命周期及属性传值props详解

创建组件的三种方式 第一种:通过ES6的方式创建 /** * 方式一 :ES6 */ export default class HelloComponent extends Component { render (){ return <Text style={{fontSize:20,backgroundColor:'red'}}>Hello</Text> } } 第二种:通过ES5的方式创建 /** * 方式二:ES5 */ var HelloComponent= React.c