render渲染vue

vue中子组件有template这个属性,在里面定义的内容会把子组件的标签覆盖,比如:

var rendercom={
        //template的内容会把mycom覆盖
        template:`<div><h1>render渲染</h1></div>`
    }
var vm = new Vue({
                    el: '#box',
                    components:{
                        'mycom':rendercom
                     }
                })

要是在调用处

<div id="box">
    <mycom></mycom>
</div>

mycom会被template的<div><h1>render渲染</h1></div>覆盖。
那根组件为什么不能有template呢?其实是有的,但是根组件的el这个属性也相当于template,设置了vue管辖的位置。那如果非要在根组件加上template呢?也是可以的

var vm = new Vue({
                    el: '#box',
template:`<div><h2>我是根组件template</h2></div>`,
                    components:{
                        'mycom':rendercom
                     }
                    
                })

但是根组件的template会把页面全部覆盖,子组件的内容有再多都没用,只会显示根组件的template。那很明显这没有意义。
同样,还有一个与根组件的template属性很像,是render(渲染)属性。

/render函数的返回值也可以替换根组件选中的dom,和template相似,render的形参createElemrnt,用于创建一个虚拟dom,当然形参名称随便。render返回值createElemrnt有两种,两种调用方式,自己构建虚拟dom。或者使用一个组件去描述虚拟dom。

  • 自己构建虚拟dom

 render:function(createElemrnt){
                   
                        //虚拟dom标签名,虚拟dom内容
                         return createElemrnt('h1','我是虚拟的dom');//VNode
                        // render函数底层会把虚拟dom转化成真实dom
                        //真实dom很耗费性能
                  
                    }
                    ,

这个相当于

 // var h1=document.createElement('h1');
                        // h1.innerHTML='我是虚拟的dom';
                        // document.body.appendChild(h1)

为什么会使用的虚拟DOM?

因为真实的DOM渲染、重绘是很耗费性能,我们可以使用虚拟DOM方式描述一个DOM对象,然后在下次有数据变化后,重新生成一个虚拟DOM,然后使用的 diff 算法让新的和旧的对比,得出差异性(专业术语 patch 补丁),然后做真实DOM操作。

  • 使用的一个组件对象去描述虚拟DOM

比如之间举例的那个rendercom子组件,

 render:function(createElemrnt){
                   
                      return createElemrnt(rendercom);
                        //真实dom很耗费性能
                  
                    }
 

这个时候就可以虚拟了这个组件。
还可以简写成

 render:h=>h(rendercom)
            

其实vue的作者还是希望大家把createElemrnt换成h,因为在vuejs底层有这样一个库,通ts语言转化成虚拟dom的,纪念意义吧。


image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前几天想学学Vue中怎么编写可复用的组件,提到要对Vue的render函数有所了解。可仔细一想,对于Vue的ren...
    kangaroo_v阅读 116,635评论 13 171
  • 主要还是自己看的,所有内容来自官方文档。 介绍 Vue.js 是什么 Vue (读音 /vjuː/,类似于 vie...
    Leonzai阅读 3,611评论 0 25
  • Vue是一个前端js框架,由尤雨溪开发,是个人项目 Vue近几年来特别的受关注,三年前的时候angularJS霸占...
    6e5e50574d74阅读 613评论 0 0
  • 更灵活的组件:Render 函数与 Functional Render Vue.js 2.x 与 Vue.js 1...
    中午吃啥_f330阅读 2,206评论 0 3
  • 一、 弟弟的骨灰在安检的时候被拦下来。 安检的姑娘以为是毒品,执意不让过。我并没有多说,只拜托她向上级反映,然后等...
    约大人阅读 337评论 0 3

友情链接更多精彩内容