前置知识回顾

new Vue({...options})一些基本知识

new Vue(options)的选项中,也可以拥有 data、methods、components、生命周期函数等等,和组件实例的 options 一样。如下例子

<div id="app">
{{uname}}
<hello-word></hello-word>
</div>
<script>
Vue.component("HelloWord", {
data() {
return {
msg: "你好,世界!",
};
},
template: "<div>HelloWord组件-{{msg}}</div>",
}); var app = new Vue({
el: "#app",
data() {
return {
uname: "小红",
};
},
});
</script>

根实例的 template、render 不是必须的,如上例子就是.

它们的作用是接受一个根组件,然后将其编译后的内容填充到 el 内.

通过 template、render 引入一个根组件,从而组成一个由上至下的组件树结构

一般情况下,我们不在根实例中定义普通选项,根实例中常用的配置项有:

{
el: "#app",
router,
store,
render:h=>h(App)
}

之所以说这些,是因为我下边的例子中,根实例有的没有用到 template、render

下边我们举例说一下vue都有哪些模板技术

方式 1: 模板-vue 单文件

使用构建工具 cli 创建项目,综合来看单文件组件应该是最好的定义组件的方式,而且不会带来额外的模版语法的学习成本。

如下,就一个完整的组件,使用的地方直接导入即可

import MyHeader from './my-header.vue'

<template>
<h1>{{title}}</h1>
</template>
<script>
// ./my-header.vue
export default {
name: "MyHeader",
props: {
title: "",
},
};
</script>

方式 2: 模板-template

Vue 最简单直接的一种定义组件模版的方式,但是方式写起来很不友好,就像我们以前拼接 HTML 元素是一样的,很痛苦,所以我们并不常用

字符串模板,template 选项对象的属性,模板将会替换挂载的元素,挂载元素的内容都将被忽略

<div id="app">
<my-header title="xx列表"></my-header>
</div>
<script>
var MyHeader = {
props: {
title: "",
},
// 此处也可以使用es6的字符串模板能力
template: "<h1>{{title}}</h1>",
}; var app = new Vue({
el: "#app",
components: { MyHeader },
});
</script>

回忆过去

需要注意是的是,大概 2018 年的时候,脚手架创建的项目

vue 实例都是使 template 属性来指定根组件

不过现在都被 render 函数写法代替了

const app = new Vue({
el: "#app",
components: { App },
template: "<App/>",
});
const app = new Vue({
render: (h) => h(App),
}).$mount("#app");

展望未来

X-Template,本质上讲,它仍是字符串模板 template 技术,是属于字符串模板的辅助性技术

定义一个 <script> 标签,标记 text/x-template类型,通过 id 链接

这个跟腾讯的artTemplate很像

<div id="app">
<my-header title="xx列表"></my-header>
</div>
<script type="text/x-template" id="my-header-xt">
<h1>{{this.title}}</h1>
</script>
<script>
Vue.component("MyHeader", {
props: {
title: "",
},
template: "#my-header-xt",
}); var app = new Vue({
el: "#app",
});
</script>

方式 3: 模板-内联模板

与 「X-template」模版定义方式被称为模版定义的替代品,把内容定义在组件标签元素的内部,而不是作为 slot 内容分发,方式比较灵活,但是给让我们组件的模版与其他属性分离开。

<div id="app">
<my-template inline-template>
<div>
<!-- 只能有一个根元素 -->
<div>{{uname}}</div>
<!-- 无法使用父组件data -->
<div>{{msg}}</div>
</div>
</my-template>
</div>
<script>
Vue.component("MyTemplate", {
data() {
return {
msg: "在子组件中声明的数据",
};
},
}); var app = new Vue({
el: "#app",
data() {
return {
uname: "小红",
};
},
});
</script>

方式 4: 模板-render 函数

单文件组件底层内部最终也是会被编译成 render 函数形式

render 函数将会替换挂载的元素,挂载元素的内容都将被忽略

模板-template的代替方案

Vue.component("MyHeader", {
props: {
title: "",
},
render(createElement) {
// 此处可以替换为jsx,会更加简介
return createElement("h1", this.title);
},
});
var app = new Vue({
el: "#app",
});

以上就是 Vue 中可以定义组件模版的几种方式,有人可能说,我特么要知道这么多干嘛,只要一种不就行了,我想说兄 die 多知道几种可以帮助我们在不同的条件下做出更好的选择。

比如:你就需要开发一个简单的页面,你非要弄个单文件组件,脚手架跑起来,何必呢,你说对不。

解析 DOM 模板时的注意事项

有些 HTML 元素,诸如 <ul><ol><table><select>,对于哪些元素可以出现在其内部是有严格限制的。而有些元素,诸如 <li><tr><option>,只能出现在其它某些特定的元素内部。

这会导致我们使用这些有约束条件的元素时遇到一些问题。例如:

<table>
<blog-post-row></blog-post-row>
</table>

这个自定义组件 <blog-post-row> 会被作为无效的内容提升到外部,并导致最终渲染结果出错。幸好这个特殊的 is attribute 给了我们一个变通的办法:

<table>
<tr is="blog-post-row"></tr>
</table>

需要注意的是如果我们从以下来源使用模板的话,这条限制是不存在的:

  • 字符串模板 (例如:template: '...')
  • 单文件组件 (.vue)
  • 模板定义的替代品之 X-Template

解读官方文档的描述,意思是说,普通这种写法(我把它称之为html模板)是不行的

<div id="app">
<select>
<my-option></my-option>
</select>
</div>
<script>
Vue.component("MyOption", {
template: "<option>选项一</option>",
}); var app = new Vue({
el: "#app",
});
</script>

使用字符串模板(模板-template)来使用组件,是可以的

<div id="app"></div>
<script>
Vue.component("MyOption", {
template: "<option>选项一</option>"
});
var app = new Vue({
el: "#app",
// 在模板-template使用也没问题
template: `<select>
<my-option></my-option>
</select>`
});
</script>

单文件组件 (.vue),是可以的

<template>
<div id="app">
<select>
<!-- 在单文件模板里这么用没问题 -->
<my-option></my-option>
</select>
</div>
</template> <script>
import MyOption from './my-option.vue'
export default {
name: 'App',
components: { MyOption },
}
</script>

在x-template中,是可以的

<div id="app"></div>
<script type="text/x-template" id="my-app-xt">
<select>
<!-- 在x-template使用没问题 -->
<my-option></my-option>
</select>
</script>
<script>
Vue.component("MyOption", {
template: `
<option>选项一</option>
</select>`,
}); var app = new Vue({
el: "#app",
template: "#my-app-xt",
});
</script>

但是以上所有,只要is属性,就都可以解决该问题。

Vue 中可以定义组件模版的几种方式的更多相关文章

  1. Vue 定义组件模板的七种方式(一般用单文件组件更好)

    在 Vue 中定义一个组件模板,至少有七种不同的方式(或许还有其它我不知道的方式): 字符串 模板字面量 x-template 内联模板 render 函数 JSF 单文件组件 在这篇文章中,我将通过 ...

  2. vue中通过路由跳转的三种方式

    原文:https://blog.csdn.net/qq_40072782/article/details/82533477 router-view 实现路由内容的地方,引入组件时写到需要引入的地方需要 ...

  3. 【Vue】Vue中的父子组件通讯以及使用sync同步父子组件数据

    前言: 之前写过一篇文章<在不同场景下Vue组件间的数据交流>,但现在来看,其中关于“父子组件通信”的介绍仍有诸多缺漏或者不当之处, 正好这几天学习了关于用sync修饰符做父子组件数据双向 ...

  4. vue中的父子组件相互调用

    vue中的父子组件相互调用: 1.vue子组件调用父组件方法:子组件:this.$emit('xx'); 父组件:定义yy方法,并在引用子组件时传参,如@xx="yy" 2.vue ...

  5. Vue 中如何定义全局的变量和常量

    Vue 中如何定义全局的变量和常量 我想要定义一个变量, 在项目的任何地方都可以访问到, 不需要每一次使用的时候, 都引入. 尝试1:创建 global.js 并且在其中定义   let a = 10 ...

  6. 黑马vue---56-58、vue组件创建的三种方式

    黑马vue---56-58.vue组件创建的三种方式 一.总结 一句话总结: 不论是哪种方式创建出来的组件,组件的 template 属性指向的模板内容,必须有且只能有唯一的一个根元素 1.使用 Vu ...

  7. vue组件通信的几种方式

    最近用vue开发项目,记录一下vue组件间通信几种方式 第一种,父子组件通信 一.父组件向子组件传值 1.创建子组件,在src/components/文件夹下新建一个Child.vue 2.Child ...

  8. C#中关于增强类功能的几种方式

    C#中关于增强类功能的几种方式 本文主要讲解如何利用C#语言自身的特性来对一个类的功能进行丰富与增强,便于拓展现有项目的一些功能. 拓展方法 扩展方法被定义为静态方法,通过实例方法语法进行调用.方法的 ...

  9. C# 中一些类关系的判定方法 C#中关于增强类功能的几种方式 Asp.Net Core 轻松学-多线程之取消令牌

    1.  IsAssignableFrom实例方法 判断一个类或者接口是否继承自另一个指定的类或者接口. public interface IAnimal { } public interface ID ...

  10. Spring Boot定义系统启动任务的两种方式

    Spring Boot定义系统启动任务的两种方式 概述 如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行,这里,容易想到web ...

随机推荐

  1. MySQL 的索引下推是什么?

    MySQL 的索引下推是什么? 索引下推(Index Condition Pushdown, ICP)是 MySQL 优化器在 InnoDB 存储引擎中引入的一种查询优化技术,从 MySQL 5.6 ...

  2. 数据处理与任务调度的双引擎:ETL工具PDI与DPDI调度管理工具的全面剖析

    ETL工具PDI及调度DPDI ETL流程解析 数据抽取(Extract) 抽取是ETL的起点,需连接多种数据源获取原始数据.如从关系型数据库提取销售记录,或从文本文件读取客户信息,为后续处理奠定基础 ...

  3. 《Deep Learning Inference on Embedded Devices: Fixed-Point vs Posit》(一)

    After the success of performing deep learning inference by using an 8-bit precision representation o ...

  4. sonarqube+gitlab+jenkins+maven集成搭建(一)

    一SonarQube介绍SonarQube 是一个开源的代码分析平台,用来持续分析和评测代码的质量,支持检测 Java . JavaScript .C#.C.C++ 等二十几种编程语言.通过 Sona ...

  5. STM32操作GPIO外设(点亮LED灯)的两种方式——使用官方库函数或直接操作寄存器

    STM32操作外设(点亮LED灯)的两种方式 准备工作: 硬件gec6818开发板.搭载stm32f407zet6芯片 keil项目模板,准备好官方库函数 官方提供的<STM32f407数据手册 ...

  6. [语法分析/编译原理] Antlr : 开源语法分析工具

    序 最近的工作涉及到数据引擎查询 DSL 设计,正好找到 Antlr. 那些繁琐的词法分析.语法分析工作全部由 Antlr 搞定,即使你不懂编译原理,也不能阻碍你使用 Antlr 开发自己的小语言. ...

  7. 【工具】VS Code Counter|除了Gitstats之外的Github一键统计代码行数工具

    需求: 1)被要求统计代码行数: 2)不想打开Linux,懒得下载Windows版本GitStats: 3)打开了Linux但也不记得find命令行怎么用: 4)打开了Linux,装好了Gitstat ...

  8. 【经验】微信小程序开发 云后台比价(自带云开发、leancloud、bmob)(2022/10/31更新)

    目录 前言 1. 免费配额 2. 超过额度时收费情况 3. 另外的价钱 总结 前言 作为前端开发者,没有购买云服务器的习惯,在只需要使用数据库的情况下,开发微信小程序完全可以用现在免费的云后台. 常用 ...

  9. 人工神经网络(ANN)模型

    一.概述   人工神经网络(Artificial Neural Network,ANN),是一种模拟生物神经网络结构和功能的计算模型,它通过大量的神经元相互连接,实现对复杂数据的处理和模式识别.从本质 ...

  10. golang+gin实现api接口开发

    一.简介: Gin是Go语言的一个微框架,也是是一个用 Go (Golang) 编写的 HTTP Web 框架,封装比较优雅,API相对友好.Gin具有性能优异和灵活快速等优点.它具有类似 Marti ...