前端组件化开发已经是一个老生常谈的话题了, 组件化让我们的开发效率以及维护成本带来了质的提升.
当然因为现在的系统越来越复杂庞大, 所以开发与维护成本就变得必须要考虑的问题, 因此滋生出了目前的三大前端框架 vue,Angular,React.
那今天我们就来看看 Vue 中有哪些定义组件模版的方式以及他们之间的一些差别.
1. 字符串形式
Vue 最简单直接的一种定义组件模版的方式, 但是方式写起来很不友好, 就像我们以前拼接 html 元素是一样的, 很痛苦, 所以我们并不常用
- Vue.component("my-button", {
- data: function () {
- return {
- label: "是兄弟就来砍我"
- }
- },
- template: "<button>{{label}}</button>"
- });
2. 模版字面量
模版字面量 ES6 语法, 与字符串不同的是, 我们可以进行多行书写, 相对单纯字符串有很大优势, 体验更优, 但是可能浏览器兼容性会存在问题, 需要进行转译为 ES5 语法.
- Vue.component("my-content", {
- data: function () {
- return {
- label: "是兄弟就来砍我",
- content: "刀刀暴击"
- }
- },
- template: `
- <div>
- <button>{{ label }}</button>
- <span>{{ content }}</span>
- </div>
- `
- });
3. 内联模版 (inline-template)
与 「X-template」模版定义方式被称为模版定义的替代品, 把内容定义在组件标签元素的内部, 而不是作为 slot 内容分发, 方式比较灵活, 但是给让我们组件的模版与其他属性分离开.
- <my-label inline-template>
- <span>{{label}}</span>
- </my-label>
- Vue.component('my-label', {
- data: function () {
- return {
- label: "赶紧上车吧, 兄 die"
- }
- }
- })
4.X-template
定义一个 < script > 标签, 标记 text/x-template 类型, 通过 id 链接.
- <script type="text/x-template" id="label-template">
- <span>{{label}}</span>
- </script>
- Vue.component('my-label', {
- template: "#label-template",
- data: function () {
- return {
- label: "赶紧上车吧, 兄 die"
- }
- }
- })
5. 渲染函数
渲染函数需要 JavaScript 完全的编程能力, 而且比模版更接近编译, 但需要我们非常熟悉 Vue 的实例属性, 也会更加的抽象. 像 v-if v-for 指令就可以用 JavaScript 语法轻松实现.
- Vue.component('my-label', {
- data: function () {
- return {
- items: ['来就送!', '来就送!', '来就送!']
- }
- },
- render: function (createElement) {
- if (this.items.length) {
- return createElement('ul', this.items.map(function (item) {
- return createElement('li', item)
- }))
- } else {
- return createElement('p', '活动结束')
- }
- }
- })
6.JSX
相比渲染函数的抽象而言, JSX 比较容易一些, 对于熟悉 React 的同学是比较友好的.
- Vue.component('my-label', {
- data: function () {
- return {
- label: ["活动结束"]
- }
- },
- render(){
- return <div>{this.label}</div>
- }
- })
7. 单文件组件
使用构建工具 cli 创建项目, 综合来看单文件组件应该是最好的定义组件的方式, 而且不会带来额外的模版语法的学习成本.
- <template>
- <div>
- <ul>
- <li v-for="(item, index) in items" :key="index">{{item}}</li>
- </ul>
- </div>
- </template>
- <script>
- export default {
- data() {
- return {
- items: ["我砍", "我砍", "我砍"]
- };
- }
- };
- </script>
以上就是 Vue 中可以定义组件模版的几种方式, 有人可能说, 我特么要知道这么多干嘛, 只要一种不就行了, 我想说兄 die 多知道几种可以帮助我们在不同的条件下做出更好的选择.
比如: 你就需要开发一个简单的页面, 你非要弄个单文件组件, 脚手架跑起来, 何必呢, 你说对不.
来源: https://juejin.im/post/5c46e3fae51d45518e14d565