new Vue () 中的 render 函数与 templete 模板

news2024/12/23 15:43:24

首先新建一个空的 Vue 项目,我们会在 main.js 文件中发现如下代码

import Vue from 'vue'
import App from './App.vue'

// 关闭vue的生产提示
Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

$mount('#app') :可以参考之前的博文 el与data的两种写法,这里就不做过多解释

其中有一个 render 函数,而且这个函数写的很奇怪,完全看不懂。如果按照我之前的理解,我觉得这个代码可能是这样的

new Vue({
  // template 渲染组件
  template: `<App></App>`,

  // components 注册组件
  components: {
    App,
  },
}).$mount("#app");

代码改成这样编译运行之后,在浏览器上并没有展现出我们希望的效果,而是在控制台报了一个错

 这个错误翻译过来就是:您正在使用Vue的仅运行时构建,其中模板编译器不可用。要么将模板预编译为呈现函数,要么使用包含编译器的构建。

理解一下,报错的意思就是,无法编译模板 templete ,要么将模板改为 render 函数,要么使用带有编译器的Vue

在官网上存在这么一个例子,说的比较清楚,按照之前的理解,我使用 templete 模板是没有问题的,但是 因为 脚手架生成的项目,引入的 Vue 文件,是不带 templete 模板编译器的 运行时文件,所以导致出现了这个问题。

验证这个问题可以按照如下方式:可以在 node_modules 包中找到当前的 Vue 包,然后点开 package.json 文件,可以看到 module 的路径是 运行时的 vue.js 文件,module 所暴露的路径,就是我们通过 import 引入时候的文件路径

如果你还是想验证一下,到底是不是这个文件,那我们在文件里面 console 一下。

 重启项目之后,在 chrome 控制台上看输出,说明确实引入的是 运行时 的vue.js 

 而官网上也明确说明了

想要解决这个问题也很简单,因为我们是通过脚手架生成的项目,脚手架引入的是不带模板编译的Vue 文件,那我们引入一个完整版的 Vue.js 文件来试试。至于 render 方法,我们稍后再说。

// import Vue from 'vue'

// 运行时的文件路径也是在 dist 目录下,只是package.json 里面 的 module 直接 暴露了运行时的文件,我们想要完整的 vue.js 也直接去 dist 目录下找就行了
import Vue from 'vue/dist/vue'

重启项目,你会发现页面完全正常了,就和之前 脚手架 新建项目展示的完全一样。

但是,问题来了,为什么脚手架创建的项目,会自动给我们引入这个 运行时 的 vue.js 包呢?为啥不引入完整版的呢?为啥不能 使用 templete 而要使用 render 呢?

render

首先,我们注释掉 脚手架生成的 render 函数 ,因为这玩意也看不懂,干脆自己写一个空的 render 函数。

new Vue({
  el:'#app'
  render() {},
  components: {
    App,
  },
})

这么写起来,在博文里面看起来一切正常,但是在编辑器里面,这玩意可就报错啦。

 render 函数 直接报错,且 ts检测之后提示,render 函数 需要有一个返回值,如果不带返回值,直接保存运行代码,页面上长啥样呢?

 直接报错,且错误提示就是 ts 给出的提示。

脚手架的 render 函数,传了一个参数,打印一下,看看这个参数是个啥

首先,该参数是一个函数,且接收了四个参数,暂时未知参数作用

其次,该函数 也返回了一个函数   createElement$1() 。

如果我们在 vue.js 文件中搜这个函数名称,我们最终会找到另外一个函数  createElement()

然后这个函数的用法 和 作用 ,官方文档上做了详细介绍 createElement 方法的使用

我们按照官网上的说明来使用一次。这两种情况都是可以正常渲染的。

new Vue({
  el: "#app",
  render(createElement) {
    /* return createElement(
      "div",
      "直接使用字符串生成虚拟文本节点,而不是使用createElement创建的子级虚拟节点"
    ); */
    return createElement("div", [createElement("h1", "使用createElement 生成的子级虚拟节点")]);
  },
  components: {
    App,
  },
});

render 函数 简写完了之后如下。

render:createElement => createElement("div", '内容'),

 和 脚手架 生成的 render 函数区别就在于,我们自己写的 render 函数内部 传了两个参数, 脚手架 的render 函数只传了一个。这是因为,第一个参数的类型可以是如下类型 

 文档上说的是,可以是 HTML 标签名称,可以是 组件,那也就是说,我的 App 组件,直接放进去当做参数,有问题没,那必须是没问题的啊。但是,需要注意,App 不能写成字符串,因为 HTML 标签名称里面也没有这玩意啊,写成变量就自动往上找到 App 组件了。

但是对于我们开发来讲的话,我觉得完整版的其实也买啥毛病啊,为啥 官方脚手架 要给我自动引入一个 不带模板解析器的 运行时 的 Vue.js 呢?

其实只有一个原因:因为完整版的 Vue.js  文件比 运行时的 Vue.js  文件要大了将近 1/3

我们需要知道,我们写在代码里面的 .vue  文件,浏览器是不认识的,浏览器只认识 js、HTML、css 文件。我们写的 .vue 文件最终是通过 webpak 打包之后,编译成了 js、HTML、css 文件 ,浏览器解析之后,展现出页面。如果我们引入了完整版的 vue.js ,那么在我们webpack 打包编译的时候,生成的包就会变大,就会增加浏览器的加载时间。

那这个时候,可能又存在疑问了,既然没有 模板编译器 ,那我 .vue  文件中的 templete 标签,怎么解析编译的呢?这是因为 脚手架单独给 .vue 文件中的  templete 标签引入了一个编译器

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/783373.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git使用--多人协作

多人协作 多⼈协作git branch -rgit checkout -b dev origin/dev 远程分⽀删除后&#xff0c;本地git branch -a依然能看到的解决办法git remote show origingit remote prune origin 多⼈协作 截止到目前&#xff0c;我们学习了如下Git的相关知识&#xff1a; 基本完成Git的…

Wireshark抓包验证TCP协议的三次握手与四次挥手

TCP的基本知识与Wireshark TCP的一些先知知识可以看下面的文章&#xff0c;了解TCP协议的基本原理&#xff0c;与报文的首部格式。 https://blog.csdn.net/weixin_52308622/article/details/131141490?spm1001.2014.3001.5501 https://blog.csdn.net/weixin_52308622/artic…

30天自制操作系统 day2 换种方式制作磁盘镜像 makefile

制作磁盘镜像工具 用的是它自己写的工具&#xff0c;叫edimg。使用方式如下 edimg imgin:../z_tools/fdimg0at.tek wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img读取fdimg0at.tek&#xff0c;在读取ipl.bin&#xff0c;从ipl.bin的开头读512个字节到fdim…

《TCP IP网络编程》第八章

第 8 章 域名及网络地址 DNS 是对IP地址和域名进行相互转换的系统&#xff0c;其核心是 DNS 服务器。域名就是我们常常在地址栏里面输入的地址&#xff0c;将比较难记忆的IP地址变成人类容易理解的信息。 计算机内置的默认DNS服务器并不知道网络上所有域名的IP地址信息。若该DN…

第 355 场 LeetCode 周赛

A 按分隔符拆分字符串 简单模拟 class Solution { public:vector<string> splitWordsBySeparator(vector<string> &words, char separator) {vector<string> res;for (auto &s: words) {int n s.size();for (int i 0, j 0; i < n;) {while (j …

C++——String类的增删查改

目录 前言 1.String类的增删查改 1.1增 实验代码&#xff1a; 运行结果&#xff1a; 实验代码&#xff1a; 运行结果:​编辑 1.2删 实验代码&#xff1a; 结果: 1.3查找 练习&#xff1a;查找文件后缀 运行结果&#xff1a; 1.4 改 前言 上篇博客中&#xff0c;我介绍了St…

VisualStudio如何进行插件开发?

文章目录 0.引言1.工具准备2.创建插件项目&#xff08;VSIX&#xff09;3.自定义VSIX属性4.创建一个command命令5.设置command名称6.编写command功能7.调试插件8.安装插件 0.引言 使用Visual Studio插件可以极大地提升开发效率、提供更好的集成环境、丰富扩展生态系统、方便调试…

【团队协作开发】IDEA中Git新建自己的dev工作分支,合并到master主分支教程(极其简单,新手)

文章目录 一、创建新dev工作分支二、push到自己的远程dev工作分支三、工作分支合并到master主分支1、先切换到master主分支2、将远程工作dev分支的内容merge到当前master分支中3、将merge提交到远程master分支 一、创建新dev工作分支 创建完新dev分支以后将默认切换到新dev分支…

K8S 证书过期后,kubeadm 重新生成证书

前言 K8S 各个组件需要与 api-server 进行通信&#xff0c;通信使用的证书都存放在 /etc/kubernetes/pki 路径下&#xff0c;kubeadm 生成的证书默认有效为 1 年&#xff0c;因此需要定时更新证书&#xff0c;否则证书到期会导致整个集群不可用。 本篇文章主要介绍如何通过 k…

openGauss学习笔记-17 openGauss 简单数据管理-表达式

文章目录 openGauss学习笔记-17 openGauss 简单数据管理-表达式17.1 简单表达式17.2 条件表达式17.3 子查询表达式17.4 数组表达式17.5 行表达式 openGauss学习笔记-17 openGauss 简单数据管理-表达式 表达式类似一个公式&#xff0c;我们可以将其应用在查询语句中&#xff0c…

SpringMVC注解介绍(二)

目录 1.RequestPart上传文件 2.获取Cookie 1.使用CookieValue 3.获取Session 3.1SessionAttribute 4.设置Session 4.1HttpSession设置Session 5.获取Header 5.1RequestHeader 6.返回数据 1.返回Json对象 7.请求转发或请求重定向 7.1forward和redirect区别 7.2请求…

element的el-upload实现多个图片上传以及预览与删除

<el-form-itemlabel"实验室照片:"prop"labUrlList"v-if"ruleForm.labHave"><el-upload:action"urlUpload":headers"loadHeader"list-type"picture-card":file-list"ruleForm.labUrlList"class…

LabVIEW在IMAQ图像中手动选择多个ROI

LabVIEW在IMAQ图像中手动选择多个ROI 设计了一个VI&#xff0c;用于在图像上生成和叠加一系列感兴趣区域&#xff08;ROI&#xff09;&#xff0c;并在IMAQ图像控件中显示它们。想挑选其中的一些进行后续处理。可以在控件中手动选择 ROI 吗&#xff1f; 以编程方式生成的 ROI…

MYSQL练习二答案

练习2答案 构建数据库 数据库 数据表 answer开头表为对应题号答案形成的数据表 表结构 表数据 答案&#xff1a; 1、修改emp表中sal字段为salary SQL语句 ALTER TABLE emp change sal salary double结果&#xff1a; 2、查找年薪在20000到30000之间的所有员工信息并按照 工…

Vue中scoped样式

scoped样式&#xff1a; 作用&#xff1a;让样式在局部生效&#xff0c;防止冲突 写法&#xff1a;<style scoped> 目录结构: Student.vue: 中的背景颜色设置的orange橙色 <template><div class"demo"><h2>学生姓名&#xff1a;{{name}}<…

文本预处理——文本张量表示方法

目录 文本张量表示one-hot编码word2vecword embedding 文本张量表示 one-hot编码 word2vec word embedding

四,Eureka 第四章

2.1.3 增加依赖 <!--添加依赖--><dependencies><!--Eureka Server--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>&l…

uniapp app nfc读取IC卡数据

先勾选权限 判断当前设备是否支持NFC以及是否打开了NFC功能 var main plus.android.runtimeMainActivity(); var NfcAdapter plus.android.importClass("android.nfc.NfcAdapter"); var _nfcAdapter NfcAdapter.getDefaultAdapter(main); console.log(NFC,_nfcA…

43:Three.js - 中

一、相机 相机&#xff0c;类似于眼睛&#xff0c;用于在3D舞台中&#xff0c;放置在不同的位置&#xff0c;实现通过不同的角度观察物体。 查看 Three.js 的文档&#xff0c;可以看到 Camera 是一个抽象类&#xff0c;一般不直接使用&#xff0c;其他类型的 Camera 实现了这个…

循环链表的实现

循环链表简介 简单来说&#xff0c;单链表像一个小巷&#xff0c;无论怎么样最终都能从一端走到另一端&#xff0c;循环链表则像一个有传送门的小巷&#xff0c;因为循环链表当你以为你走到结尾的时候&#xff0c;其实你又回到了开头。循环链表和非循环链表其实创建的过程以及…