vue中 render 函数功能与原理分析

 更新时间:2023年06月07日 10:20:31   作者:webchang  
这篇文章主要介绍了vue中 render 函数功能与原理,结合实例形式分析了vue中render函数的基本功能、原理及相关操作注意事项,需要的朋友可以参考下

1. 前言

在使用 vue-cli2 脚手架构建项目时,如果选择了Runtime-only模式,那么在main.js文件中会有下面一段代码:

有关Runtime + Compiler的介绍可以看这篇文章:Vue中 Runtime + Compiler 和 Runtime-only 两种模式含义和区别

import Vue from 'vue'
import App from './App'
Vue.config.productionTip = false
new Vue({
  el: '#app',
  render: h => h(App)
})

2. 分析render函数

2.1 render 函数的作用

Vue 推荐在绝大多数情况下使用模板来创建你的 HTML。然而在一些场景中,真的需要 JavaScript 的完全编程的能力。这时可以用渲染函数,它比模板更接近编译器。

render 函数和 template 一样都是创建 html 模板的,但是有些场景中用 template 实现起来代码冗长繁琐而且有大量重复,这时候就可以用 render 函数。

2.2 render 函数讲解

render 函数即渲染函数,它是个函数,它的参数 createElement 也是个函数。

上边的代码中 render: h => h(App) ,这是 ES6的箭头函数的写法,可以把 h 当作 createElement 的别名。所以这段代码其实相当于:

render: function (createElement) {
    return createElement(App)
}

2.3 createElement 函数讲解

这个函数的作用就是生成一个 VNode节点,render 函数得到这个 VNode 节点之后,返回给 Vue.js 的 mount 函数,渲染成真实 DOM 节点,并挂载到根节点上。

createElement 函数的返回值是 VNode(即:虚拟节点)
有关对 VNode 的介绍可以看这篇博客:VNode简介

createElement 函数的3个参数

  • 一个 HTML 标签字符串,组件选项对象,或者解析上述任何一种的一个 async 异步函数。类型:String | Object | Function。必需。
  • 一个包含模板相关属性的数据对象,你可以在 template 中使用这些特性。类型:Object。可选。
  • 子虚拟节点 (VNodes),由 createElement() 构建而成,也可以使用字符串来生成“文本虚拟节点”。类型:String | Array。可选。

实现createElement函数

1、普通用法

// main.js文件
new Vue({
  el: '#app',
  render:function (createElement) {
    //1.普通用法
    // createElement(标签,{属性},[内容])
    return createElement("h2",{class:"box"},['hello',createElement("button",["按钮"])])
  }
})

运行效果如图所示:
在这里插入图片描述
2、我们也可以自定义一个组件,传递给render函数

// ...
let Cpn = {
  template:`<h2>{{message}}</h2>`,
  data(){
    return {
      message:"我是组件"
    }
  }
}
new Vue({
  el: '#app',
  render:function (createElement) {
    //2.使用组件
    return createElement(Cpn)
  }
})

运行效果如图所示:
在这里插入图片描述
3、既然我们能够使用组件,那么App组件也是可以的

import Vue from 'vue'
import App from './App'
Vue.config.productionTip = false
new Vue({
  el: '#app',
  render:function (createElement) {
    return createElement(App)
  }
})

效果如图所示:
在这里插入图片描述

3. 参考资料

render渲染函数 — Vue.js官网

补充

关于Vue中 render: h => h(App) 的具体含义的理解

​一、问题:

https://github.com/vuejs-templates/webpack-simple/blob/master/template/src/main.js

import Vue from 'vue'
import App from './App.vue'
new Vue({
  el: '#app',
  render: h => h(App)
})

vue的代码中有这么一段,令人第一眼对这个 h 函数十分困惑??

二、原因:

经过查找相关资料后发现:

render: h => h(App) 是下面内容的缩写:

render: function (createElement) {
    return createElement(App);
}

进一步缩写为(ES6 语法):

render (createElement) {
    return createElement(App);
}

再进一步缩写为:

render (h){
    return h(App);
}

按照 ES6 箭头函数的写法,就得到了:

render: h => h(App);

其中 根据 Vue.js 作者 Even You 在 Vue 的 issue 中的回复,h 的含义如下:

It comes from the term "hyperscript", which is commonly used in many virtual-dom implementations. "Hyperscript" itself stands for "script that generates HTML structures" because HTML is the acronym for "hyper-text markup language".

它来自单词 hyperscript,这个单词通常用在 virtual-dom 的实现中。Hyperscript 本身是指 
生成HTML 结构的 script 脚本,因为 HTML 是 hyper-text markup language 的缩写(超文本标记语言)

三、总结:

h 函数的本质是createElement 函数,这个函数的作用就是生成一个 VNode节点,render 函数得到这个 VNode 节点之后,返回给 Vue.js 的 mount 函数,渲染成真实 DOM 节点,并挂载到根节点上

而之所以要 叫 h,根据作者解释是,来源于 hyper script,

........

个人觉得可读性差了很多,就算是外国人不经解释也很难理解这个 h 函数

不如直接 createElement 

相关文章

  • 一文带你深入了解V-model实现数据双向绑定

    一文带你深入了解V-model实现数据双向绑定

    这篇文章主要为大家详细介绍了V-model实现数据双向绑定的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • vue如何通过router-link或者button跳转到一个新的页面

    vue如何通过router-link或者button跳转到一个新的页面

    这篇文章主要介绍了vue如何通过router-link或者button跳转到一个新的页面,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vue整合百度地图显示指定地点信息

    vue整合百度地图显示指定地点信息

    本文主要介绍了vue整合百度地图显示指定地点信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 五分钟理解keep alive用法及原理

    五分钟理解keep alive用法及原理

    这篇文章主要为大家介绍了keep alive用法及原理示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 解决vue更新路由router-view复用组件内容不刷新的问题

    解决vue更新路由router-view复用组件内容不刷新的问题

    今天小编就为大家分享一篇解决vue更新路由router-view复用组件内容不刷新的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Vue父组件监听子组件生命周期

    Vue父组件监听子组件生命周期

    这篇文章主要介绍了Vue父组件监听子组件生命周期,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Vuex利用state保存新闻数据实例

    Vuex利用state保存新闻数据实例

    本篇文章主要介绍了Vuex利用state保存新闻数据实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • vue使用socket与服务端进行通信的代码详解

    vue使用socket与服务端进行通信的代码详解

    这篇文章主要给大家介绍了vue如何使用socket与服务端进行通信的相关资料,在Vue中我们可以将Websocket类封装成一个Vue插件,以便全局使用,需要的朋友可以参考下
    2023-09-09
  • Vue路由跳转传参后无法清空地址栏参数问题解决方案

    Vue路由跳转传参后无法清空地址栏参数问题解决方案

    这篇文章主要介绍了Vue路由跳转传参后无法清空地址栏参数问题解决方案,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-05-05
  • Vue+iview+webpack ie浏览器兼容简单处理

    Vue+iview+webpack ie浏览器兼容简单处理

    这篇文章主要介绍了Vue+iview+webpack ie浏览器兼容简单处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09

最新评论