最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • React知识点 (必知必会)

    正文概述 掘金(Tsuki_)   2021-01-19   651

    React.pureComponent 与React.Component 区别

    • shouldComponentUpdate: 我们知道组件存在生命周期函数 shouldComponentUpdate(),我们可以这个生命周期中对props与state进行比较,决定在更新props与state之后是否需要重新渲染,如果shouldComponentUpdate()返回true,则当前组件的重新渲染(render函数执行),返回false则不需要重新渲染。默认情况下(如果我们不写 shouldComponentUpdate函数), shouldComponentUpdate()返回true,所以只要当父组件触发重新渲染,子组件也会跟着重新渲染。

    • React.Component: React.Component组件的shouldComponentUpdate函数执行原则就遵循上面shouldComponentUpdate的介绍。

    • React.PureComponent: React.PureComponent组件的shouldComponentUpdate会在 React.Component的shouldComponentUpdate原有基础上进行一波加强,简而言之,PureComponent组件的shouldComponentUpdate默认情况下(如果我们不写 shouldComponentUpdate函数),会自己进行一波props与state的浅比较,决定返回true or false,而Component组件在默认情况下置灰无脑返回true。

    总结:

    所以当props与state没有发生变化的时候,可能为了性能优化,Component组件中还要手动对比变化,决定是否更新,而PureComponent自己内置比较,就不需要我们再手动比较。

    • PS: 浅比较采用Object.is,简而言之在处理+0与-0时返回false,NaN与NaN返回true,其他与===处理相同,所以如果当我们进行更新state数据的话,例如this.state.arr :['marker'],当我们使用this.setState({arr:this.state.arr.push('marker')}),PureComponent组件是不会发生重新渲染的,因为对于浅比较数组,这种写法数组引用相同地址,浅比较会认为其没有发生变化,导致不触发重新渲染,所以请合理使用setState。

    react中元素与组件的 区别

    • react元素: 让我们想想react中的元素,我们第一反应是不是下面这个element
    // 代码1
    const element =
        <div className="ele">
            <p>React</p>
            {/* 注意 这里是个组件 function Child() { return <div>child</div> } */}
            <Child />
        </div>
    

    没错这是一段JSX代码,JSX代码react中是如何处理的呢,没错是通过babel转义,调用eact.createElement函数,最终返回出一个对象,像下面这样。

    // 1,最常写的JSX
    const element =
        <div className="ele">
            <p>React</p>
            {/* 注意 这里是个组件 function Child() { return <div>child</div> } */}
            <Child />
        </div>
        
    // 2,通过babel转义 调用React.creactElement()
    const element = React.createElement(
        "div",
        {
            className: "ele"
        },
        React.createElement("p", null, "React"),
        React.createElement(Child, null)
    );
    
    // 3,React.creactElement()最终返回结果
    const element = {
        type: 'div',
        props: {
            className: "ele",
            children: [
                {
                    type: 'p',
                    props: {
                        children: 'React'
                    }
                },
                {
                    type: 'Child',
                    props: {
    
                    }
                }
            ]
        }
    }
    

    到这里,我们发现所谓的react元素本质就是一个js的对象,描述了react虚拟dom的结构,而我们的react根据虚拟dom的结构渲染出最终的真实dom。

    如果虚拟dom的结构中是type = 'div' , type = 'p'这种,react知道最终渲染的就是div与p标签,如果type = 'Child'(首字母大写),react并不能立即知道渲染什么样的dom元素,因为这是一个react的组件,react会根据当前组件的返回值(函数组件)或者render函数的返回值(类组件)确定最终渲染的dom,这里的Child最终返回的是<div>child</div>,所以对应的就是{type: 'div', props: { children: "child" }},如果里面还有组件,则继续递归该操作,直到确定所有的虚拟dom数据。

    • react组件: 说到react组件我们肯定想起来下面两种组件形式
    // 函数组件
    function Child() {
        return <div>Child</div>
    }
    // 类组件
    class Child extends React.Component {
        render() {
            return <div>Child</div>
        }
    }
    

    第一种函数组件以返回值的形式返回需要渲染的react元素
    第二种类组件通过render函数返回我们需要渲染的react元素
    所以react组件的本质就是用来返回react元素,而所用到的hook或者生命周期函数等无非是就是帮助处理最终返回的react元素是什么样的,对于逐渐的复用本质就是复用该组件返回的react元素,React 元素是React 应用的最基础组成单位。

    总结:

    react元素react应用的最基础组成单位,本质是js对象,告诉react最终真实dom长什么样,而react组件本质就是用来返回react元素的函数或者类,组件的复用实则便是对组件最终返回的react元素进行复用。

    参考整理来源 : React 深入系列1:React 中的元素、组件、实例和节点


    起源地下载网 » React知识点 (必知必会)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元