专栏首页Modeng的专栏聊一聊Vue组件模版,你知道它有几种定义方式吗?

聊一聊Vue组件模版,你知道它有几种定义方式吗?

前端组件化开发已经是一个老生常谈的话题了,组件化让我们的开发效率以及维护成本带来了质的提升。

当然因为现在的系统越来越复杂庞大,所以开发与维护成本就变得必须要考虑的问题,因此滋生出了目前的三大前端框架 Vue、Angular、React。

那今天我们就来看看 Vue 中有哪些定义组件模版的方式以及他们之间的一些差别。

字符串形式

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

Vue.component("my-button", {
  data: function () {
    return {
      label: "是兄弟就来砍我"
    }
  },
  template: "<button>{{label}}</button>"
});

模版字面量

模版字面量 ES6 语法,与字符串不同的是,我们可以进行多行书写,相对单纯字符串有很大优势,体验更优,但是可能浏览器兼容性会存在问题,需要进行转译为 ES5 语法。

Vue.component("my-content", {
  data: function () {
    return {
      label: "是兄弟就来砍我",
      content: "刀刀暴击"
    }
  },
  template: `
    <div>
      <button>{{ label }}</button>
      <span>{{ content }}</span>
    </div>
  `
});

内联模版(inline-template)

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

<my-label inline-template>
  <span>{{label}}</span>
</my-label>
Vue.component('my-label', {
  data: function () {
    return {
      label: "赶紧上车吧,兄die"
    }
  }
})

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"
    }
  }
})

渲染函数

渲染函数需要 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', '活动结束')
    }
  }
})

JSX

相比渲染函数的抽象而言,JSX 比较容易一些,对于熟悉 React 的同学是比较友好的。

Vue.component('my-label', {
  data: function () {
    return {
      label: ["活动结束"]
    }
  },
  render(){
    return <div>{this.label}</div>
  }
})

单文件组件

使用构建工具 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多知道几种可以帮助我们在不同的条件下做出更好的选择。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Vue案例引发的「过滤器」的使用

    最近在项目的开发中,出现一些格式化数据的情况,比如字母的大小写,比如一些价格的数据格式。等等一些格式的显示。

    六小登登
  • CSS系列之教你几招小技巧,让开发更高效

    俗话说「人靠衣装马靠鞍」,一个网页的漂亮与否CSS起到了很大的作用。它能够帮助我们进行美化。因此 CSS 在前端开发中的地位不用多说。

    六小登登
  • Vue2.5笔记:Class与Style几种绑定用法

    在我们的项目开发中给元素添加/删除 class 是非常常见的行为之一, 例如我们的网站导航都会给选中项添加一个 active 类用来区别选与未选中的样式,除了...

    六小登登
  • 聊聊rocketmq的LatencyFaultTolerance

    rocketmq-client-4.6.0-sources.jar!/org/apache/rocketmq/client/latency/LatencyFau...

    codecraft
  • 大话设计模式笔记(七)——模版方法模型

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    逝兮诚
  • iOS开发--使用友盟快速分享与第三方登录注意事项

    在info.plist中加入安全域名白名单(右键info.plist用source code打开)

    雷潮
  • 介绍bigpipe以及bigpipe在django上的实现

    什么是BigPipe 关于BigPipe是在看一篇淘宝ued的官方博客上看到的,原文是说用nodejs做前后端分离的,只是稍微提了一下bigpipe。 感兴趣...

    Bob.Chen
  • 生成不重复值的几种方法

    生成的值为现在至格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒(北京时间 1970 年 01 月 01 日 00 时 00 分 0...

    Joel
  • 看完这届谷歌 I/O 大会,我要换安卓!Jeff Dean:AI是一切动力

    可以说今年的Google I/O大会就是一场AI大秀了。谷歌CEO皮采(Sundar Pichai)演讲时的语气和动作看似很是轻松,与过去相比更加游刃有余。他表...

    新智元
  • Android Activity的四种启动模式

    记得第一次探讨Activity的启动模式,是在2017年8月份,那个时候对一年后走出校门的未来很是憧憬,时间真快,已经毕业四个月,工作和生活也都趋于稳定。

    黄林晴

扫码关注云+社区

领取腾讯云代金券