美文网首页
react Hooks

react Hooks

作者: 鹿啦啦zz | 来源:发表于2020-05-26 12:55 被阅读0次

    技术胖博客

    React Hooks

    类与Hooks 写法对比

    先来写一个最简单的有状体组件,点我们点击按钮时,点击数量不断增加。
    原始写法:

    import React, { Component } from 'react';
    
    class Example extends Component {
        constructor(props) {
            super(props);
            this.state = { count:0 }
        }
        render() { 
            return (
                <div>
                    <p>You clicked {this.state.count} times</p>
                    <button onClick={this.addCount.bind(this)}>Chlick me</button>
                </div>
            );
        }
        addCount(){
            this.setState({count:this.state.count+1})
        }
    }
    
    export default Example;
    

    React Hooks 写法:

    import React, { useState } from 'react';
    function Example(){
        const [ count , setCount ] = useState(0);
        return (
            <div>
                <p>You clicked {count} times</p>
                <button onClick={()=>{setCount(count+1)}}>click me</button>
            </div>
        )
    }
    export default Example;
    

    React Hooks不能出现在条件判断语句中

    因为它必须有完全一样的渲染顺序

    错误示范:

    import React, { useState } from 'react';
    let showSex = true
    function Example2(){
        const [ age , setAge ] = useState(18)
        if(showSex){
            const [ sex , setSex ] = useState('男') // 不可在判断语句中使用useState
            showSex=false
        }
    
        const [ work , setWork ] = useState('前端程序员')
        return (
            <div>
                <p>JSPang 今年:{age}岁</p>
                <p>性别:{sex}</p>
                <p>工作是:{work}</p>
    
            </div>
        )
    }
    export default Example2;
    

    useEffect

    useEffect函数来代替生命周期函数

    在使用React Hooks的情况下,我们可以使用下面的代码来完成上边代码的生命周期效果,代码如下(修改了以前的diamond): 记得要先引入useEffect后,才可以正常使用。

    import React, { useState , useEffect } from 'react';
    function Example(){
        const [ count , setCount ] = useState(0);
        //---关键代码---------start-------
        useEffect(()=>{
            console.log(`useEffect=>You clicked ${count} times`)
        })
        //---关键代码---------end-------
    
        return (
            <div>
                <p>You clicked {count} times</p>
                <button onClick={()=>{setCount(count+1)}}>click me</button>
            </div>
        )
    }
    export default Example;
    

    useEffect两个注意点

    1. React 首次渲染 和之后的 每次渲染 都会调用一遍useEffect函数,而之前我们要用两个生命周期函数分别表示首次渲染(componentDidMonut)和更新导致的重新渲染(componentDidUpdate)。

    2. useEffect中定义的函数的执行不会阻碍浏览器更新视图,也就是说这些函数时 异步执行 的,而componentDidMonutcomponentDidUpdate中的代码都是同步执行的。个人认为这个有好处也有坏处吧,比如我们要根据页面的大小,然后绘制当前弹出窗口的大小,如果时异步的就不好操作了。

    useEffect实现componentWillUnmount

    useEffect的第二个参数,它是一个数组,数组中可以写入很多状态对应的变量,意思是当状态值发生变化时,我们才进行解绑。但是当传空数组[]时,就是当组件将被销毁时才进行解绑,这也就实现了componentWillUnmount的生命周期函数。

    function Index() {
        useEffect(() => {
            console.log('Index页面数据有变')
            return () => {
                console.log('组件解绑')
            }
        },[]) // 第二个参数为空数组,组件将被销毁时才进行解绑
        return <h2>Index</h2>;
    }
    

    相关文章

      网友评论

          本文标题:react Hooks

          本文链接:https://www.haomeiwen.com/subject/gaveahtx.html