Vue.js 中,7种定义组件模板的方法 | Codementor
来源:互联网 发布:sql 转换类型 编辑:程序博客网 时间:2024/06/05 23:46
在vue中定义模板组件时存在有多种选择。我算了一下,至少有7种不同的方法:http://www.tuicool.com/topics
String
Template literal
X-Templates
Inline
Render functions
JSX
Single page components
当然,可能还会有更多方法!
在这篇文章里,我们将会展示每一个示例,并且分析其优缺点,以便你能明白在对应的情形下,哪种方式是合适的。
_注意: 这篇文章最初发表在 这里 Vue.js Developers blog on 2017/03/24_
1. Strings
默认情况下,模板会作为一个字符串被定义在你的JS文件里。但是我觉得大家都同意这种写法是难以看懂的,除了广泛的浏览器支持之外,这种方法并没有太多的好处。
Vue.component('my-checkbox', { template: '<div class="checkbox-wrapper" @click="check"><div :class="{ checkbox: true, checked: checked }"></div><div class="title">{{ title }}</div></div>', data() { return { checked: false, title: 'Check me' } }, methods: { check() { this.checked = !this.checked; } }});
2. Template literals(模板字符串)
通过ES6的模板字符串(反引号)语法,你在定义模板时可以直接换行,这是你通过常规的JavaScript字符串没法做到的。 这种写法更容易阅读,并且这种模板字符串语法得到了许多新版本浏览器的支持。当然,为了安全起见,你仍然应该把它转译为ES5的语法形式。
然而,这种方式并不完美,我发现大多数的IDE在语法高亮上做的差强人意,并且缩进和换行等,仍然是个痛。
Vue.component('my-checkbox', { template: <div class="checkbox-wrapper" @click="check"> <div :class="{ checkbox: true, checked: checked }"></div> <div class="title">{{ title }}</div> </div>, data() { return { checked: false, title: 'Check me' } }, methods: { check() { this.checked = !this.checked; } }});
3. X-Templates
使用这种方法,你需要在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">{{ title }}</div> </div></script>
4. Inline Templates(内联模板)
通过给组件添加 inline-template
属性来告诉Vue,在其里面的内容就是模板,而不是把它当作是分发内容(见 slots )。
它的缺点和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">{{ title }}</div> </div></my-checkbox>
5. Render functions(渲染函数)
渲染函数需要你把模板当作一个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,一些开发者认为JSX语法太丑,不直观,而且和Vue的简洁特性相违背。
JSX首先需要编译,因为浏览器并不支持JSX。但是如果你需要使用渲染函数,那么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> }});
7. Single File Components(单文件组件)
只要在你的配置中使用的是合适的构建工具,那么单文件组件绝对是这些方法中的首选。它们有两个最好的优点:允许你使用标记,同时把所有组件定义都写在一个文件中。
单文件组件需要编译,并且一些IDE不支持这种类型文件的语法高亮,否则它难以被其它方法打败。
<template> <div class="checkbox-wrapper" @click="check"> <div :class="{ checkbox: true, checked: checked }"></div> <div class="title">{{ title }}</div> </div></template><script> export default { data() { return { checked: false, title: 'Check me' } }, methods: { check() { this.checked = !this.checked; } } }</script>
你可能认为还有更多的方式来定义模板,因为你可能使用一些预编译模板,比如Pug.
哪个最好?
当然没有完美的方法,你应该根据你的实际案例来进行判断。我觉得一个好的程序员能知道所有可能性,并把它们当作Vue.js技术栈里一种解决问题的工具。
- Vue.js 中,7种定义组件模板的方法 | Codementor
- Vue.js 中,7种定义组件模板的方法
- Vue.js 中,7种定义组件模板的方法
- 认识Vue.js的组件和模板
- 【17】vue.js — 组件(模板)
- Vue 创建组件的两种方法
- vue-schart : vue.js 的图表组件
- vue.js中组件的创建和使用方法
- vue开发:vue全局组件的方法
- 【IMWeb训练营作业】vue.js-组件的定义及使用
- vue组件传递对象中实现单向绑定的方法
- vue脚手架中自定义全局组件的方法
- vue 定义组件
- javaScript vue定义组件
- vue定义组件
- 【Vue.js】-Vue.js组件
- Vue组件模板注意事项
- Vue组件-模板
- 使用TFHpple解析html
- cesuim
- tensorflow1.1/构建深度卷积神经网络识别物体识别
- Linux 安装.src.rpm源码包的方法
- react-native 爬坑经历
- Vue.js 中,7种定义组件模板的方法 | Codementor
- python3-安装使用virtualenv虚拟环境
- swift 框架大全
- ios Xcode更新之后模拟器无法找到?
- Gradle中的buildScript代码块
- IE8+SpringMVC文件上传防止JSON下载
- 求素数问题 oj16
- 结构体,指针嵌套内存对其位域条件编译
- 圆形图片的引用