React进阶

博客包含2019独角兽企业Python工程师招聘信息,重点介绍React相关技术。如PropTypes和DefaultProps的作用,props、state和render函数关系,虚拟DOM及Diff算法提升性能的原理,ref使用、生命周期函数,还提及axios使用、避免子组件重复渲染方法及react - transition - group动画。

PropTypes和DefaultProps

PropTypes用来校验从父组件传递的属性的类型

TodoItem.propTypes = {
    item: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
    deleteItem: PropTypes.func,
    test: PropTypes.string.isRequired
}

defaultProps用来设置属性的默认值

TodoItem.defaultProps = {
    test: 'hello'
}

props、state和render函数的关系

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

当父组件的render函数被执行时,子组件的render函数都将被重新执行


虚拟DOM

生成新的DOM需要调用WEB API,每个元素都很多属性和内容,所以DOM操作很消耗性能

虚拟DOM,使用JS模拟/描述DOM结构,通过Diff算法,来对比两次虚拟DOM(JS对象)的差异
能精确定位到发生变化的属性/元素然后再进行渲染,而不是重新渲染整个元素或DOM树,进而大大提高性能


React中的Diff算法

虚拟DOM比对是通过Diff(Different)算法实现的,比对规则

1、同级比较,第一层一致,再比对下一层,若有差异,就不再往下比对,提升比对速度

2、通过key值,可以迅速匹配到比对对象;所以key值要唯一且稳定,不要用indexkey

3、setState方法是异步的,短时间内的多次setState可以合并成一次,减少虚拟DOM比对次数


React中ref的使用

reference引用,用来获得页面上的DOM元素
ref={(input) => { this.input = input }}e.target可以替换成this.input

在与setState同时使用时,要将DOM操作放在setState的第二个参数中,也是一个匿名/箭头函数

因为setState是一个异步的方法,通过ref获得的DOM元素并不是最新的,另外react不建议直接操作DOM


React生命周期函数

指在某一时刻组件会自动执行的函数

将被废弃的生命周期函数:componentWillMount()componentWillUpdate()componentWillReceiveProps()


axios的使用

安装依赖包npm install axios --save

import axios from 'axios'
componentDidMount() {
    axios.get('/api/list.json').then((res) => {
        this.setState(() => ({
            list: [...res.data.list] //最好打散
        }))
    }).catch(() => { alert('error') })
}

避免子组件重复渲染

使用shouldComponentUpdate生命周期函数

shouldComponentUpdate(nextProps) {
    if (nextProps.item !== this.props.item) {
        return true
    } else {
        return false
    }
}

react-transition-group动画

安装npm install react-transition-group --save

JSX模板

import { CSSTransition } from 'react-transition-group'
<CSSTransition
    in={this.state.flag}
    timeout={1000}
    classNames='fade'
    unmountOnExit
    appear={true}
    onEntered={(el) => { el.style.color = 'red' }}
>
    <div>hello</div>
</CSSTransition>

CSS样式

.fade-enter, .fade-appear {
    opacity: 0;
}

.fade-enter-active, .fade-appear-active {
    opacity: 1;
    transition: all 1s ease-in;
}

.fade-enter-done, .fade-appear-done {
    opacity: 1;
}

.fade-exit {
    opacity: 1;
}

.fade-exit-active {
    opacity: 0;
    transition: all 1s ease-in
}

.fade-exit-done {
    opacity: 0;
}

<TransitionGroup><CSSTransiton>用于对一组元素设置动画


转载于:https://my.oschina.net/startjcu/blog/3051325

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值