《深入react技术栈》学习笔记二初入React世界

前言

上一篇文章中,我们讲到了JSX的一些用法和注意事项,这次我们来讲react中最基础也是特别重要的内容:组件。这篇文章包含组件的以下内容:状态、属性、生命周期。

正文

一.组件演变

W3C标准委员会制定的规范:Web Components.每个自定义组件可以定义自己对外提供的属性方法、还有事件。,内部可以像写一个页面一样,专注于实现功能来完成对组件的封装。
1.Web Components主要由四部分组成
(1)HTML templates 定义了之前模板的概念
(2)Custom Elements 定义了组件的展现形式
(3)shadow DOM 定义了组件的作用域范围、可以囊括样式
(4)HTML Imports 提出了新的引入方式

二.React组件的构建

React的本质就是关心元素的构成,React组件即为组件元素。组件元素被描述为纯粹的JSON对象,意味着可以使用方法和类来构建。React组件基本上有三部分组成: 属性、状态和生命周期方法

React组件可以接收参数,也可能有自身状态。一旦接收到的参数或者自身状态有所改变,React组件就会执行相应的生命周期方法,最后渲染。

React组件的构建方法
(1)React.createClass
用React.createClass构建组件是最传统、兼容性最好的方法
示例代码如下:

const Button = React.createClass({
    getDefaultProps(){
        return{
            color:'blue',text:'confirm'
        };
    },render(){
        const {color,text} = this.props;
        return(
            <button className={'btn btn-${color}'}>
                <em>{text}</em>
            </button>
        );
    }    
});

(2)ES6 Classes

import React,{Component} from 'react'

class Button extends Component{
constructor(props){
    super(props);
}
static defaultProps = {
    color:'blue',text:'confirm'
}
render(){
    return (
    <button className={'btn btn-${color}'}>
        <em>{text}</em>
    </button>
    );
}

}

(3)无状态组件
使用无状态函数构建的组件就称为无状态组件。
示例代码如下:

function Button({
    color:'blue',text:'confirm'
}){
    return (
        <button className = {'btn btn-${color}'}>
            <em>{text}</em>
        </button>
    );
};

注意事项:
(1)无状态组件只传入props和context两个参数;也就是说它不存在state,也没有生命周期方法
(2)无状态组件不会像上面两种方法一样在调用时会创建新的实例,它创建时始终保持了一个实例。

三.React数据流

1.简单介绍:
(1)在React中,数据是自顶向下单向流动,即从父组件到子组件。
(2)如果顶层组件初始化 props,那么React会向下遍历整棵组件树,重新尝试渲染所有相关的子组件。
(3)而state只关心每个组件自己内部的状态,这些状态只能在组件内变化。

2.state
一个组件都有自己的state,它存在于组件的内部。
当组件内部使用库内置的setSate方法时,最大的表现行为就是该组件会尝试重新渲染。
值的注意的是,setState是一个异步方法一个生命周期内的所有setSate方法会合并操作。

3.prop
props是properties的简写,它是react用来组件间联系的一种机制,通俗地讲就像方法的参数一样。
React的单向数据流主要的流动通道就是prop。prop本身是不可变的。组件的props一定来自属性或通过父组件传递而来。react为props提供了认配置,通过defaultProps静态变量的方式定义。

子组件prop:
在React中有一个重要的内置 Prop——children,它代表组件的子组件集合。React.Children是官方提供的一系列操作children的方法。它提供诸如:map forEach count等使用函数,可以为我们处理子组件提供便利。

propTypes:
propTypes用于规范props的类型与必需的状态。如果组件定义了propTypes,那么在开发环境下就会对组件的props值进行类型检查,如果不匹配,就会在控制台里报warning.

4.prop与state的区别
标题内容来源:https://github.com/yunxifd/re...

官方文档中已经给出了怎样判断数据是否应为组件的state的方法
1、数据是否从父组件通过props传递给子组件?如果是,它可能不是state。
2、数据是否随着时间的推移不发生变化?如果是,它可能不是state。
3、数据是否能够通过其他state或props计算所得?如果是,它就不是state。

进一步探索,参考文档Working with Data in React: Properties & State

props 是组件的输入值,主要用来初始化组件的state和渲染组件。实例化组件后,props是不可变的。props只能在组件实例化的时候,设置值。因此,当组件re-rendered的时候,react会比较new和old props 来决定哪些DOM需要更新。

state 表示由组件更改的数据,通常是通过与用户的交互来更改的。为了实现state的修改,需要注册事件处理程序到相应的DOM元素上。当事件发生时,将更新后的值是从DOM中检索,并通知组件。在组件可以使用state,组件必须通过getinitialState函数初始化。通常情况下,该getinitialState函数初始化状态使用static value,props,或其他数据存储。

总结:
props 是不可变的
state 是可变的

四.组件生命周期

1.组件的挂载

import React,{Component,PropTypes} from 'react'
class App extends React.Component{
    static propTypes{
        //...
    };
    static defaultProps={
        //...
    };
    constructor(props){
        super(props);
        this.state={
            //...
        };
    }
    componentwillMount(){
        //...
    }
    componentDidMount(){
        //...
    }
    render(){
        <div>this is a demo </div>
    }
}

getDefaultProps:
对于组件类来说,这个方法只会被调用一次。对于那些没有被父辈指定props属性的新建实例来说,这个方法返回的对象可用于为实例设置认的props值

getinitialState:
对于组件的每个实例来说,这个方法调用次数有且只有一次。在这里你有机会初始化每一个实例的state。与getDefaultProps不同的是,每次实例创建时,该方法都会调用一次。在这方法里,你已经可以访问到 this.props

componentwillMount:
方法会在首次渲染之前被调用,这也是在render方法调用前可以修改组件state的最后一次机会。

render:
在这里你会创建一个虚拟的DOM,用于表示组件的输出。对于一个组件来说, render是唯一一个必须的方法
render方法返回的结果不是真正的DOM,而是一个虚拟的表现,react随后会和它真是的DOM做对比,来判断是否有必要做修改

componentDidMount:
在render方法成功调用并且真是的DOM已经被渲染之后,你可以在componentDidMount内部通过this.getDOMNode()方法访问到它。

2.组件的卸载

componentwillUnmount:
方法会在组件移除之前被调用,让你有机会做一些清理工作。我们常执行一些清理方法,比如事件回收或者清除定时器。

3.数据更新过程

数据更新指的是父组件向下传递props或许组件自身执行setState方法时发生的一系列更新动作。

class App extends React.Component{
    componentwillReceiveProps(nextProps){
        //this.setSate({})
    }
    shouldComponentUpdate(nextProps,nextSate){
        //return true
    }
    componentwillupdate(preProps,preSate){
        //...
    }
    componentDidUpdate(){
        //...
    }
    render(){
        return(
            <div>this is a demo </div>
        )
    }
}

componentwillReceiveProps:
在任意时刻,组件的props都可以通过父辈组件来更改。出现这种情况时,该方法将会被调用,它也将获得更改props对象以及更新state的机会。

shouldComponentUpdate:
它接收需要更新的prop和state,让开发者增加必要的条件判断,让其在需要时更新,不需要时不更新。因此,当该方法返回false的时候,组件不在向下执行生命周期方法

componentwillUpdate:
组件会接收新的props和state进行渲染之前调用方法
注意:你不可以在该方法中更新props和state。而应该借助componentwillReceiveProps在运行时更新
state.

componentDidUpdate:
方法给我们提供了更新已经渲染好的DOM的机会。

五.组件设计原则

详细请见:https://github.com/react-comp...(1)职责清晰多个组件协同完成一件事情,而不是一个组件替其他组件完成本该它自己完成的事情。(2)扁平访问组件推荐使用状态来控制交互和显示,如果需要显示访问,也尽量实行扁平访问,即只可以调用其 children 的方法。(3)信息冗余尽量避免信息冗余,如果某个 state 可以由其他 state 计算得到,那么就删除这个 state(4)api 尽量和已知概念保持一致如果 api 可以和已知概念保持一致,那么就用已知的 api(5)使用标签嵌套尽量使用标签嵌套而不是属性配置。(6)避免使用 ref使用父组件的 state 控制子组件的状态而不是直接通过 ref 操作子组件

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom