• react 中的无状态函数式组件


    无状态函数式组件,顾名思义,无状态,也就是你无法使用State,也无法使用组件的生命周期方法,这就决定了函数组件都是展示性组件,接收Props,渲染DOM,而不关注其他逻辑。

    其实无状态函数式组件也是官方比较推荐的一种方式,尽量让底层的组件变成无状态函数式组件,也即组件尽量只用来显示数据,把数据操作的逻辑都放在顶层,然后从顶层把数据传到底层

    嗯,看个例子,使用类组件和无状态函数式组件两种方法进行对比

    顶层关键代码:

    import React,{Component} from 'react';  
    import ReactDOM from 'react-dom';  
    import Bottom from './component/props'  
      
    ReactDOM.render(  
        <div>  
            <Bottom name="donna"/>  
        </div>  
        ,  
    document.getElementById('root')  
    )

    底层代码,使用无状态函数式组件实现

    import React,{Component} from 'react';  
    export default  function Bottom(props){  
        let{name} = props  
        const sayHi = () => {  
            console.log(`Hi ${name}`);  
        }  
        return (  
            <div>  
                <h1>Hello, {name}</h1>  
                <button onClick ={sayHi}>Say Hi</button>  
            </div>  
        )  
    }

    然后看类式组件的实现方法

    import React,{Component} from 'react';  
      
    export default  class Bottom extends Component{  
        constructor(props){  
            super(props);  
            this.sayHi = this.sayHi.bind(this)//记得绑定this,否则this指向可能会出错  
        }  
      
        sayHi(){  
            let {name} = this.props  
        console.log(`Hi ${name}`);  
        }  
        render(){  
            let {name} = this.props  
            let{sayHi} =this;  
            return(  
                <div>  
                    <h1>{`Hello, ${name}`}</h1>  
                    <button onClick ={sayHi}>Say Hi</button>  
                </div>  
            )  
        }
    }

    对比下来,确实无状态函数组件代码量少(轻量),最重要的是,函数式组件简单啊,类式组件一不小心就出错了。

    函数式组件更容易理解。当你看到一个函数组件时,你就知道它的功能只是接收属性,渲染页面,它不执行与UI无关的逻辑处理,它只是一个纯函数。而不用在意它返回的DOM结构有多复杂。

    不需要声明类,可以避免大量的譬如extends或者constructor这样的代码

    不需要显示声明this关键字,在ES6的类声明中往往需要将函数的this关键字绑定到当前作用域,而因为函数式声明的特性,我们不需要再强制绑定

    无状态组件不支持 "ref"
    有一点遗憾的是无状态组件不支持 "ref"。原理很简单,因为在 React 调用到无状态组件的方法之前,是没有一个实例化的过程的,因此也就没有所谓的 "ref"。

  • 相关阅读:
    javascript语法之函数案例练习
    javascript语法之函数的定义
    javascript语法之with语句
    javascript语法之for-in语句
    javascript语法之循环语句小练习
    centos 7 配置samba mount
    Centos 7 systemd.service — Service unit configuration
    Linux 下使用 ffmpeg 大批量合并 ts 文件, mp4切割文件为m3u8
    Debian 系统修改网卡ens33名称为 eth0
    star_namelist
  • 原文地址:https://www.cnblogs.com/crazycode2/p/9047107.html
Copyright © 2020-2023  润新知