账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    想问下为什么需要递归调用mountComponent,不是在一开始就已经调用class内部的render进行全部渲染了吗
    29
    0

    如果按照递归这个逻辑的话每次都会调用inst.render(),但是class内部的render方法是一开始就写好了的,每次都渲染同一个return值吗?比如:

    class Demo extends React.Component {
        constructor(...args) {
            super(...args);
        }
        render() {
            return <div>
                <span>123</span>
                <span>12345</span>
            </div>
        }
    }  
    

    为什么需要递归调用mountComponent,不是在一开始就已经调用class内部的render进行全部渲染了吗?是不是像下面那样进行一个个createElement进行渲染的,比如先是div,第二次递归是span进行render,谢谢

    React.createElement(
            'div',    // type,标签名,原生DOM对象为String
            null,
            React.createElement('span', null, '123'),   // children,子元素
            React.createElement('span', null, '12345'),
    )
    

    下面是部分源码,react版本是15.6.0git reset --hard 911603b

    // 如果不是stateless,即无状态组件,则调用render,返回ReactElement
    if (renderedElement === undefined) {
      renderedElement = this._renderValidatedComponent();
    }
    
    _renderValidatedComponent: function () {
        var renderedComponent;
        ReactCurrentOwner.current = this;
        try {
          renderedComponent = this._renderValidatedComponentWithoutOwnerOrContext();
        } finally {
          ReactCurrentOwner.current = null;
        }
        return renderedComponent;
    },
    
    _renderValidatedComponentWithoutOwnerOrContext: function () {
        var inst = this._instance;
        // 调用render方法,得到ReactElement。JSX经过babel转译后其实就是createElement()方法。这一点在前面也讲解过
        var renderedComponent = inst.render();
        return renderedComponent;
    },
    
    this._renderedComponent = this._instantiateReactComponent(renderedElement);
    
    // 递归渲染,渲染子组件
    var markup = ReactReconciler.mountComponent(this._renderedComponent, transaction, nativeParent, nativeContainerInfo, this._processChildContext(context));
    

    原文链接

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 唐三 普通会员 1楼

      在React中,递归调用mountComponent主要用于组件的挂载和卸载,也就是说在组件被创建和卸载的过程中。当你创建一个组件实例时,React会通过调用mountComponent方法来挂载这个组件。

      class内部的render方法是用于渲染组件内部的内容的,通常在React组件中,我们会使用state、props和生命周期方法来处理组件的状态和数据,而这些内容通常是在render方法中实现的。

      当你需要在组件挂载和卸载的过程中,对组件的内容进行更新或者做一些其他操作时,就需要通过递归调用mountComponent方法。例如,你可能需要在组件挂载时更新状态,或者在组件卸载时清理状态。

      总的来说,通过递归调用mountComponent,我们可以让组件在组件的生命周期中进行一系列的操作,从而实现组件的各种功能。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部