react(三)

59 阅读2分钟

react开发工具的安装和使用

谷歌浏览器右侧三点 更多工具---扩展程序---谷歌应用商店---搜索react --- React Developer Tools

PropTypes 与 DefaultProps

使用propTypes第一步引入propTypes

import PropTypes from 'prop-types'

propTypes指的是外部传过来的prop,类型做一个校验,都可以写在propTypes里面

defaultProps指如果父组件没有向子组件传递这样的信息,可以在defaultProps里面定义这个默认值

// todoItem 
import React, { Component } from "react";
import PropTypes from 'prop-types'
class TodoItem extends Component {
    constructor(props) {
        super(props)
        this.handleClick = this.handleClick.bind(this)
    }
    render() {
        const { content } = this.props
        return (<div onClick={this.handleClick}>{content}</div>)
    }
    handleClick() {
        const { deleteItem, index } = this.props
        deleteItem(index)
    }
}
TodoItem.propTypes = {
    content: PropTypes.string.isRequired, // string类型是从PropTypes包里拿到的
    deleteItem: PropTypes.func,    
    index: PropTypes.number
}
TodoItem.propTypes = {
    content: "填写吧" 
}
export default TodoItem;

Props、state和render函数的关系

当组件的state或者props发生改变的时候,render函数就会重新执行,

当父组件的render函数被运行时,它的子组件的render都会被重新运行一次

虚拟DOM

  1. state数据
  2. JSX模板 JSX并不是一个真实的DOM,JSX先被转化为React.createElement('div', {'id': 'abc'},'123' )然后变成虚拟DOM,最后渲染成真正的DOM
  3. 生成虚拟DOM(虚拟DOM就是一个JS对象,用它来描述真实的DOM) 损耗了性能 ["div", {"id": "abc"}, ["span", {}, "123"]]
  4. 数据 + 模板的结合,生成真实的DOM来显示   
    123
  5. state 数据发生变化
  6. 数据 + 模板生成新的虚拟DOM,**(极大的提升了性能) **  ["div", {"id": "abc"}, ["span", {}, "456"]]
  7. 比较原始虚拟DOM和新的虚拟DOM的区别,找出区别是span中的内容**(极大的提升了性能)**
  8. 直接操作DOM,改变span中的内容

优点:

1. 性能得到了提升

2. 它使得跨端得以实现。React Native

虚拟DOM中的diff算法如何比对

setState 是异步的,为了提升react底层的性能,虚拟DOM的比对是同层的比对,第一层之间的虚拟DOM如果一致,再去比对第二层的虚拟DOM,如果第一层的虚拟DOM不一致,那就删除当前节点下的所有DOM,重新生成DOM

React中ref的使用

<ul ref={(ul)=>(this.ul = ul)}>   {this.getTotoItem()}</ul>

handleBtnClick() {
        this.setState((prevState)=>({
            list: [...prevState.list, prevState.inputValue],
            inputValue: ''        
}), ()=>{
            console.log(this.ul.querySelectorAll("div").length)
});}