react16新特性

2020-02-15  本文已影响0人  祝家庄打烊

生命周期

1、getSnapshotBeforeUpdate
状态改变时触发,触发在render之前,传递两个参数,上一个props和上一个state,返回值作为componentDidUpdate第三个参数传入。

getSnapshotBeforeUpdate(prevProps, prevState){
    return 456
}
componentDidUpdate(perProps, perState, perScrollHeight){
    console.log("perScrollHeight",perScrollHeight);
}

2、componentDidCatch
捕获子组件的错误信息

componentDidCatch(error){
    console.log("error",error);
}

新语法

1、React.Fragment
每个组件都会有个根元素进行包裹,通过React.Fragment可以让列表元素独立存在组件。

<React.Fragment>
     <div onClick={()=>this.child()}>Catch1</div>
     <div onClick={()=>this.child()}>Catch2</div>
     <div onClick={()=>this.child()}>Catch3</div>
</React.Fragment>

2、React.memo
React.memo() 和 PureComponent 很相似,它帮助我们控制何时重新渲染组件。父组件的状态更新不会影响子组件的渲染,我们可以仅仅让某些组件进行渲染。
class Catch extends React.PureComponent
export default React.memo(Catch)
3、React.createContext
父组件可以隔代传递数据给子组件,父组件通过Provider定义数据,子组件通过Consumer接收数据。
context.js文件

import React from 'react';
let {Provider ,Consumer} = React.createContext();
export {Provider ,Consumer};

父组件

render(){
    return <Provider value={this.state}>
        {this.props.children}
    </Provider>
}

子组件

render(){
    let {path ,component:Component} = this.props;
    return <Consumer>
        {(state)=>{
            console.log(state)
        }}
    </Consumer>
}

hooks

无状态组件也就函数形式的组件无法定义状态,也没有生命周期,hooks提供了这些功能。减少class定义组件的复杂行、对组件进行了优化。
1、useState定义状态

import React, { useState } from 'react';
function Hook(){
    const [getCount,setCount] = useState(99);
    const [getName,setName] = useState("祝阳");
    return (
        <div>
            <p>姓名:{getName}   年纪:{getCount}</p>
            <button onClick={()=>setCount(getCount+1)}>click</button>
        </div>
    )
}
export default Hook;

2、useEffect定义生命周期

//componentDidMount和componentDidUpdate都会触发
useEffect(()=>{
    console.log("生命周期")
});
//componentDidMount触发
useEffect(()=>{
    console.log("生命周期")
},[]);
//componentDidUnmount触发
useEffect(()=>{
        return ()=>{
            console.log("生命周期")
        }
    },[]);
//componentUpdate触发
const mounted = useRef();
useEffect(()=>{
    if(!mounted.current){
        //componentDidMount
        mounted.current=true
    }else{
        //componnentDidUpdate
    }
});

3、useContext参数传递
根组件的定义

<CountContext.Provider value={count}>
    <Counter />
</CountContext.Provider>

子组件的定义

import React, { useState , createContext , useContext } from 'react';
function Child(){
    const count = useContext(CountContext)  //得到count
    return (<h2>{count}</h2>)
}
上一篇下一篇

猜你喜欢

热点阅读