Vue3.x 全家桶 | 05 - Vue 的 template 选项

一、Vue 实例的 template

在前面的文章中,我们都是把 HTML 结构放在 template 属性中;在 Vue 的语法中 template 就是用于定义组件模板的选项,描述组件的结构和布局。

我们可以像前面的文章一样把 HTML 代码放在 createApp 方法的参数对象的 template 属性中,作为 template 的属性值:

js 复制代码
const app = Vue.createApp({
  template: `
    <h2>计数器 {{counter}}</h2>
    <button v-on:click="increment">+1</button>
    <button v-on:click="decrement">-1</button>
  `,
  data: function(){
    return {
      counter: 0
    }
  },
  methods: {
    increment: function(){
      this.counter++
    },
    decrement: function(){
      this.counter--
    }
  },
})

app.mount('#app')

template 选项声明的 HTML 结构会完全替换掉 div#app 中的内容,我们可以来给 div#app 中增加一些内容,创建一个 HTML 页面,内容如下:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <div>div#app中原本的内容</div>
  </div>

  <script src="../lib/vue.js"></script>
</body>
</html>

使用 LiverServer 打开 HTML 页面:

在 HTML 中增加上述的 JS 代码,再次刷新页面

可以看到 div#app 中原有的内容全部被 template 选项声明的 HTML 结构替换掉了。

但是如果 HTML 结构比较庞大,会造成大量的 HTML 代码堆积在 script 标签的 JS 代码中,不好维护,通常我们会把 template 声明的 HTML 结构放在 body 标签,可以将上述代码改成如下形式:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <h2>计数器 {{counter}}</h2>
    <button @click="increment">+1</button>
    <button @click="decrement">-1</button>
  </div>

  <script src="../lib/vue.js"></script>
  <script>
    const app = Vue.createApp({
      data: function(){
        return {
          counter: 0
        }
      },
      methods: {
        increment: function(){
          this.counter++
        },
        decrement: function(){
          this.counter--
        }
      },
    })

    app.mount('#app')
  </script>
</body>
</html>

createApp 方法传入的对象参数中没有 template 属性,默认就会渲染 div#app 里面的内容。

Vue 语法中,template 是 Vue 实例的一个配置选项,其类型可以是字符串、函数或者返回字符串的函数,在 template 中我们可以使用包含插值表达、指令如 v-for、v-model 等以及其他 Vue 模板语法。

在之后的 Vue 组件化开发中 template 有着非常重要的作用:

  1. 定义组件的结构: template 用于描述组件的HTML结构,包括元素、样式、布局等。这允许开发者以一种更模块化、可复用的方式构建用户界面。

    html 复制代码
    <template>
      <div>
        <h1>{{ title }}</h1>
        <p>{{ content }}</p>
      </div>
    </template>
  2. 支持动态数据绑定:template中可以使用插值表达式({{ expression }})、指令(如v-bindv-forv-if等)等Vue模板语法,从而实现对数据的动态绑定。

    html 复制代码
    <template>
      <div>
        <h1>{{ title }}</h1>
        <ul>
          <li v-for="item in items">{{ item }}</li>
        </ul>
      </div>
    </template>
  3. 提高代码可读性: 通过将模板从 JavaScript 代码中分离出来,使得代码更加清晰、易读。template允许开发者专注于组件的外观和结构,而不必在 JavaScript 中嵌入大段的 HTML 代码。

    html 复制代码
    <template>
      <div>
        <!-- 清晰可读的模板结构 -->
        <h1>{{ title }}</h1>
        <p>{{ content }}</p>
      </div>
    </template>
  4. 提供单文件组件支持: 在实际项目中,通常使用单文件组件(.vue文件),该文件中包含了模板、脚本和样式。template 是其中的一部分,用于定义组件的 HTML 结构。

    html 复制代码
    <!-- MyComponent.vue -->
    <template>
      <div>
        <h1>{{ title }}</h1>
        <p>{{ content }}</p>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          title: 'Vue Component',
          content: 'This is a Vue component.'
        };
      }
    };
    </script>
    
    <style scoped>
    /* 样式定义 */
    </style>

template 在Vue的组件化开发中扮演着定义组件外观的重要角色,使得我们可以更加灵活地构建用户界面,并且提高了代码的可维护性和可读性。

template 是 Vue 语法中 Options API 中的 Options: Rendering 模块的语法,类似的还有 插槽 slot 等。

Options:Rendering 是指 Vue 实例的一系列选项,用于配置渲染相关的行为。这些选项影响Vue组件的渲染过程,包括模板的编译、虚拟DOM的生成和更新、渲染函数的执行等。

相关推荐
空中海23 分钟前
01 React Native 基础、核心组件与布局体系
javascript·react native·react.js
前端之虎陈随易3 小时前
2年没用Nodejs了,Bun很香
linux·前端·javascript·vue.js·typescript
好运的阿财4 小时前
OpenClaw工具拆解之host_workspace_write+host_workspace_edit
前端·javascript·人工智能·机器学习·ai编程·openclaw·openclaw工具
XiYang-DING4 小时前
JavaScript
开发语言·javascript·ecmascript
空中海5 小时前
02 React Native状态、导航、数据流与设备能力
javascript·react native·react.js
空中海5 小时前
02 状态、Hooks、副作用与数据流
开发语言·javascript·ecmascript
空中海6 小时前
04 React Native工程化、质量、发布与生态选型
javascript·react native·react.js
杨超凡6 小时前
豆包收费了?我特么自己用“意念”搓了一个!
javascript
threelab7 小时前
Three.js 咖啡杯烟雾效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能