亲宝软件园·资讯

展开

React底层

杉菜酱_ 人气:0

1. props,state与render函数关系,数据和页面如何实现互相联动?

当组件的state或者props发生改变的时候,自己的render函数就会重新执行。
注意:当父组件的render被执行的时候,子组件的render也会被重新执行一次(因为在父组件的render里面)。
即当绑定的事件改变了state或者props,render函数就会重新执行解析页面,这时解析的时候就会使用新的数据了,所以页面就会变化。

2. React中的虚拟DOM

因为只要state、props改变就会重新渲染render,可以想象要不断的重新渲染页面对性能要求非常高,实际上render的性能时非常高的,这归功于虚拟DOM。
首先提前明确DOM的相关操作需要调用web application对性能损耗是比较高的。

常规思路

改良思路(仍使用DOM)

React的思路

深入理解虚拟DOM

Vue与React中的虚拟DOM的原理和步骤是完全一致的。
React中真实DOM的生成步骤:JSX -> createElement方法 -> JS对象(虚拟DOM) -> 真实的DOM。
因此可见,JSX中的div等标签仅仅是JSX的语法,并不是DOM,仅用于生成JS对象。
其实在React中创建虚拟DOM(JS对象)使用的是(没有JSX语法也可用下面的方法生成)

// 传三个参数:标签 属性 内容
// <div>item</div>
// 所以其实没有JSX语法也可以用下面的方式生成
React.createElement('div',{},'item')

虚拟DOM的优点:

3. 虚拟DOM的diff算法

4. React中ref的使用

<input
    id = "insertArea"
    className="input"
    value={this.state.inputValue}
    onChange={this.handleInputChange}
    ref={(input)=>{this.input = input}}
/>

handleInputChange(e){
    // const value = e.target.value; // 原始的方法
    const value = this.input.value;
    this.setState(() => ({
        inputValue: value
    }))
}

一般情况下不推荐使用ref这种方法,因为setState是一个异步函数,因此去操作DOM的时候可能无法正确的输出页面的最新DOM情况,有时候比较复杂的操作如动画之类的,如果一定要使用,就需要在setState的第二个函数,这个是回调函数,在setState完成的时候触发。

handleBtnClick(e){
    this.setState((prevState)=>({
        list: [...prevState.list, prevState.inputValue], // 展开运算符
        inputValue: '',
    }), ()=>{
        console.log(this.ul.querySelectorAll('div').length);
    });
}

5. React中的生命周期函数

组件挂载的过程:

6. 生命周期函数的使用场景

加载全部内容

相关教程
猜你喜欢
用户评论