Vue.js 定义组件模板的七种方式

转载自  Vue.js 定义组件模板的七种方式

在 Vue 中定义一个组件模板,至少有七种不同的方式(或许还有其它我不知道的方式):

  • 字符串
  • 模板字面量
  • x-template
  • 内联模板
  • render 函数
  • JSF
  • 单文件组件

在这篇文章中,我将通过示例介绍每个选项,并探讨利弊。以便你知道在任何特定情况下最适合的是哪一种。

1. 字符串

默认情况下,模板会被定义为一个字符串。我想我们的观点会达成一致:字符串中的模板是非常难以理解的。除了广泛的浏览器支持之外,这种方法没有太多用处。

Vue.component('my-checkbox', {template: `<div class="checkbox-wrapper" @click="check"><div :class="{ checkbox: true, checked: checked }"></div><div class="title"></div></div>`,data() {return { checked: false, title: 'Check me' }},methods: {check() { this.checked = !this.checked; }}
});

2. 模板字面量

ES6 模板字面量允许你使用多行定义模板,这在常规 JavaScript 字符串中是不被允许的。此方式阅读体验更佳,并在许多现代浏览器中得到支持,不过安全起见你还是需要把代码转换成 ES5 。
这种方法并不完美,我发现大多数 IDE 仍然会通过语法高亮、tab 格式化、换行符等地方的问题折磨着你。

Vue.component('my-checkbox', {template: `<div class="checkbox-wrapper" @click="check"><div :class="{ checkbox: true, checked: checked }"></div><div class="title"></div></div>`,data() {return { checked: false, title: 'Check me' }},methods: {check() { this.checked = !this.checked; }}
});

3. x-template

使用此方法,你的模板被定义在例如 index.html 文件中的 script 标签里。此 script 标签使用 text/x-template 标记,并由组件定义的 id 引用。
我喜欢这种方法,它允许你使用适当的 HTML 标记编写你的 HTML,不过不好的一面是,它把模板和组件定义的其它部分分离开来。

Vue.component('my-checkbox', {template: '#checkbox-template',data() {return { checked: false, title: 'Check me' }},methods: {check() { this.checked = !this.checked; }}
});
<script type="text/x-template" id="checkbox-template"><div class="checkbox-wrapper" @click="check"><div :class="{ checkbox: true, checked: checked }"></div><div class="title"></div></div>
</script>

4. 内联模板

通过在组件中添加 inline-template 属性,你可以向 Vue 指示内部内容是其模板,而不是将其视为分布式内容(参考 slot 。
它与 x-templates 具有相同的缺点,不过一个优点是,内容在 HTML 模板的正确位置,因此可以在页面加载时呈现,而不是等到 JavaScript 运行。

Vue.component('my-checkbox', {data() {return { checked: false, title: 'Check me' }},methods: {check() { this.checked = !this.checked; }}
});
<my-checkbox inline-template><div class="checkbox-wrapper" @click="check"><div :class="{ checkbox: true, checked: checked }"></div><div class="title"></div></div>
</my-checkbox>

5. render 函数

render 函数需要你将模板定义为 JavaScript 对象,这显然是最详细和抽象的模板选项。
不过,优点是你的模板更接近编译器,并允许你使用完整的 JavaScript 功能,而不是指令提供的子集。

Vue.component('my-checkbox', {data() {return { checked: false, title: 'Check me' }},methods: {check() { this.checked = !this.checked; }},render(createElement) {return createElement('div',{attrs: {'class': 'checkbox-wrapper'},on: {click: this.check}},[createElement('div',{'class': {checkbox: true,checked: this.checked}}),createElement('div',{attrs: {'class': 'title'}},[ this.title ])]);}
});

6. JSX

Vue 中最有争议的模板选项是 JSX,一些开发者认为它丑陋、不直观,是对 Vue 精神的背叛。JSX 需要你先编译,因为它不能被浏览器运行。
不过,如果你需要完整的 JavaScript 语言功能,又不太适应 render 函数过于抽象的写法,那么 JSX 是一种折衷的方式。

Vue.component('my-checkbox', {data() {return { checked: false, title: 'Check me' }},methods: {check() { this.checked = !this.checked; }},render() {return <div class="checkbox-wrapper" onClick={ this.check }><div class={{ checkbox: true, checked: this.checked }}></div><div class="title">{ this.title }</div></div>}
});

单文件组件

只要你把构建工具设置的很舒服,单文件组件就是模板选项中的王者。它允许你写 HTML 标签定义组件,并且将所有组件定义保留在一个文件中。
尽管它也有一些劣势:需要预编译,某些 IDE 不支持 .vue 文件的语法高亮,不过其地位依然难以被撼动。

<template><div class="checkbox-wrapper" @click="check"><div :class="{ checkbox: true, checked: checked }"></div><div class="title"></div></div>
</template>
<script>export default {data() {return { checked: false, title: 'Check me' }},methods: {check() { this.checked = !this.checked; }}}
</script>

你还可以通过引入 pug 之类的预处理器,来获得模板定义的更多可能性。

最好的是哪一个?

当然没有一个完美的方法,每一个都应该根据你的用例来判断。我认为最好的开发人员会注意到所有的可能性,并将它们作为 Vue.js 工具栏的一个工具。

文章翻译自: http://vuejsdevelopers.com/2017/03/24/vue-js-component-templates

本文章首发在 Laravel China 社区


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

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

相关文章

.Net Core上用于代替System.Drawing的类库

目前.Net Core上没有System.Drawing这个类库&#xff0c;想要在.Net Core上处理图片得另辟蹊径。 微软给出了将来取代System.Drawing的方案&#xff0c;偏向于使用一个单独的服务端进行各种图片处理https://github.com/dotnet/corefx/issues/2020https://github.com/imazen/Gra…

16-1 Redis分布式缓存引入与保存缓存功能实现

16-1 Redis分布式缓存引入与保存缓存功能实现 现在功能已经完成了&#xff0c;但是我们还是要考虑一下性能问题&#xff0c;现在任何请求都是要到数据库中查询很多的数据&#xff0c;才能知道当前的用户是否有权限可以访问当前的url&#xff0c;当我们的请求量很大时&#xff…

oracle基本笔记整理

oracle&#xff0c;简单来说就是数据库&#xff0c;数据库 &#xff0c;顾名思义&#xff0c;就是存放数据的容器&#xff01;&#xff01; 不知道oracle的我先科普一下吧~~~科普&#xff0c;科学普及简称科普&#xff0c;又称大众科学或者普及科学&#xff0c;是指利用各种传…

不同范数下的余弦定理_第06题 | 从源头追溯「余弦定理」amp; 文理科知识点的异同...

文、理科数学大部分知识点、甚至相关知识点的考查形式都是共同的&#xff0c;甚至往年理科题目过几年就会出现在文科试卷上&#xff0c;反之亦然&#xff1b;「射影定理」是「余弦定理」的直接来源&#xff0c;所以不算超纲知识点。先发福利&#xff1a;这里有6场「高考数学」系…

ASP.NET CORE 项目实战 ---图形验证码的实现

简介   很长时间没有来更新博客了&#xff0c;一是&#xff0c;最近有些忙&#xff0c;二是&#xff0c;Core也是一直在摸索中&#xff0c;其实已经完成了一个框架了&#xff0c;并且正在准备在生产环境中试用&#xff0c;但是很多东西也是出于自己理解的肤浅和技术的不断更新…

vue.js 接收url参数

转载自 vue.js 接收url参数1) 路由配置传参方式在配置路由时 例如 "/firewall/authorize/:uid/:uname/:token"页面url为 http://XXX.com/firewall/authorize/23/zhangman/232454 js 接收方式 this.$route.params.uid,2) ?传参方式例 http://XXX.com/firewall/auth…

在IDEA中将SpringBoot项目打包成jar包的方法 不要用 在上面有可以用的

在IDEA中将SpringBoot项目打包成jar包的方法 2018年03月07日 10:43:52 叶叶叶叶大爷 阅读数 71375 版权声明&#xff1a; https://blog.csdn.net/qq_37105358/article/details/79467401 SpringBoot项目无需依赖tomcat容器(内含)就可以发布,现在将打包步骤记录一下: 1. 打包前…

磁珠 符号_贴片磁珠功能_贴片磁珠应用

磁珠专用于抑制信号线、电源线上的高频噪声和尖峰干扰&#xff0c;还具有吸收静电脉冲的能力。磁珠是用来吸收超高频信号&#xff0c;像一些RF电路&#xff0c;PLL&#xff0c;振荡电路&#xff0c;含超高频存储器电路(DDRSDRAM&#xff0c;RAMBUS等)都需要在电源输入部分加磁珠…

跨平台的 NodeJS 组件解决 .NetCore 不支持 System.Drawing图形功能的若干问题

问题 生成缩略图生成验证码生成二维码给图片加水印 外部引用 Node 不解释 https://nodejs.org/en/download/sharp 高性能缩略图 https://github.com/lovell/sharpqr-image 二维码 https://github.com/alexeyten/qr-imagecaptchagen 验证码 https://github.com/contra/ca…

Vue动态路由匹配

转载自 动态路由匹配我们经常需要把某种模式匹配到的所有路由&#xff0c;全都映射到同个组件。例如&#xff0c;我们有一个 User 组件&#xff0c;对于所有 ID 各不相同的用户&#xff0c;都要使用这个组件来渲染。那么&#xff0c;我们可以在 vue-router 的路由路径中使用…

用IDEA把SpringBoot项目打成jar发布项目 不要用 在上面有可以用的

用IDEA把SpringBoot项目打成jar发布项目 2019年03月27日 11:08:51 小天努力学java 阅读数 235更多 所属专栏&#xff1a; SpringBoot学习 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/tian330726/article/details/8882…

oracle笔记整理2

--创建员工信息表 create table employee ( empno number(4) not null,--员工编号 ename varchar2(10), --员工姓名 job varchar2(9), --员工工种 mgr number(4), --上级经理编号 hiredate date, --受雇日期 sal number(7,2), --员工薪水 comm number(7,2…

lin通讯从节点同步间隔场_汽车行业必须知识--CAN FD通讯

前面我们讲了CAN的基础知识&#xff0c;但是由于CAN总线存在通讯速率低&#xff0c;报文头过长&#xff0c;刷新速率低等缺点。为解决这些问题CAN-FD应运而生。首先看看发展历史&#xff0c;2012年&#xff0c;BOSCH发布CAN FD white paper V1.0&#xff1b;2014&#xff0c;In…

ASP.NET Core loves JavaScript

前言 在 ASP.NET 团队的 Github 的主页上&#xff0c;有这样一个开源项目叫&#xff1a;“JavaScriptsServices”&#xff0c;那么什么是 JavaScriptsServices 呢&#xff1f; 它又有什么用呢&#xff1f; 下面就让我们一起来看一下吧。 什么是 JavascriptServices GitHub&…

npm 常用命令详解

转载自 【原】npm 常用命令详解今年上半年在学习gulp的使用&#xff0c;对npm的掌握是必不可少的&#xff0c;经常到npm官网查询文档让我感到不爽&#xff0c;还不如整理了一些常用的命令到自己博客上&#xff0c;于是根据自己的理解简单翻译过来&#xff0c;终于有点输出&…

阿里云服务器 window server tomcat启动 并且关闭window防火墙 配置8080端口开放还是没用

阿里云windows server 服务器开放端口 1.远程服务器关闭windows防火墙 不需要开放端口 2.阿里云管理平台开放指定的端口 如8081 阿里云服务器 window server tomcat启动 并且关闭window防火墙 配置8080端口开放还是没用 必须阿里云控制台开放指定的端口 不…

以ABP为基础架构的一个中等规模的OA开发日志

前言&#xff1a; 最近园子里ABP炒的火热。看了几篇对于ABP的介绍后&#xff0c;深感其设计精巧&#xff0c;实现优雅。个人感觉&#xff0c;ABP或ABP衍生品的架构设计&#xff0c;未来会成为中型Net项目的首选架构模式。如果您还不了解ABP是什么&#xff0c;有什么特色&#x…

vue 指令基本使用大全

转载自 vue 指令基本使用大全 指令 解释&#xff1a;指令 (Directives) 是带有 v- 前缀的特殊属性作用&#xff1a;当表达式的值改变时&#xff0c;将其产生的连带影响&#xff0c;响应式地作用于 DOM 常用指令 v-textv-htmlv-bindv-text 解释&#xff1a;更新元素的 textCon…

JAVA基础学习---Markdown

这里写自定义目录标题Markdown学习标题字体引用分割线图片超链接列表有序列表无序列表表格代码进退源代码模式Markdown学习 标题 加上空格是一级标题&#xff0c;二级标题是两个#加上空格&#xff0c;以此类推 字体 hello&#xff0c;world 前后各加两个*是粗体 hello&…

opencv立方体的画法_用opengl立方体的画法

/*** &#xff01; 使用该程序前须知 &#xff01;1.首先下载 glut-3[1].7.6.rar 压缩包2.解压后里面会有如下三个文件&#xff0c;把这三个文件分别放入 to 后的文件夹glut32.dll to C:\windows\System32glut32.lib to ..\..\VC98\lib 这个目录在VC6.0安装目录中可以找到glut.…