当前位置: 首页 > news >正文

<template>标签的用法

一、原生的template标签的用法

<template> 是 HTML5 引入的一个标签,用于声明 HTML 片段,这些片段在页面加载时不会被渲染,但可以在运行时通过 JavaScript 实例化和使用。

基本用法

<template id="myTemplate">
<div class="card">
<h2>标题</h2>
<p>这是一个模板内容</p>
</div>
</template>

主要特点

  1. 延迟渲染:模板内容在页面加载时不会显示
  2. 惰性加载:模板中的脚本不会执行,图片不会加载,音频不会播放
  3. 可克隆:可以多次实例化模板内容

使用方法

1. 通过 JavaScript 克隆模板

// 获取模板元素
const template = document.getElementById('myTemplate');// 克隆模板内容
const clone = template.content.cloneNode(true);// 将克隆的内容添加到DOM中
document.body.appendChild(clone);

2. 动态修改模板内容

const template = document.getElementById('myTemplate');
const clone = template.content.cloneNode(true);// 修改克隆后的内容
clone.querySelector('h2').textContent = '动态标题';
clone.querySelector('p').textContent = '动态内容';document.body.appendChild(clone);

3. 在 Web Components 中使用

class MyComponent extends HTMLElement {
constructor() {
super();
const template = document.getElementById('myTemplate');
const shadowRoot = this.attachShadow({mode: 'open'});
shadowRoot.appendChild(template.content.cloneNode(true));
}
}customElements.define('my-component', MyComponent);

实际应用示例

<template id="userCard">
<div class="user-card">
<img class="avatar" data-src="" alt="用户头像">
<h3 class="username"></h3>
<p class="bio"></p>
</div>
</template><script>
function createUserCard(userData) {
const template = document.getElementById('userCard');
const clone = template.content.cloneNode(true);clone.querySelector('.avatar').src = userData.avatarUrl;
clone.querySelector('.username').textContent = userData.name;
clone.querySelector('.bio').textContent = userData.bio;return clone;
}// 使用示例
const user = {
avatarUrl: 'path/to/avatar.jpg',
name: '张三',
bio: '前端开发者'
};document.body.appendChild(createUserCard(user));


注意事项

  1. 模板内容必须有一个唯一的 ID 以便引用
  2. 模板可以包含任何有效的 HTML,包括样式和脚本
  3. 模板中的 <script> 和 <style> 在克隆后才会执行/应用
  4. 模板可以放在 <head><body> 或任何其他允许放置普通元素的容器中

<template> 标签非常适合用于需要重复使用的UI组件或动态生成内容的情况,可以提高代码的可维护性和性能。

二、在Vue中,template标签的用法

在 Vue.js 中,<template> 标签有特殊的用途和意义,它与原生 HTML 的 <template> 标签有所不同。以下是 Vue 中 <template> 标签的主要用法:

1. 作为根模板容器

在 Vue 单文件组件 (SFC) 中,<template> 是必需的根元素,用于包裹组件的 HTML 结构:

<template>
<div>
<h1>{{ title }}</h1>
<p>{{ content }}</p>
</div>
</template><script>
export default {
data() {
return {
title: 'Vue 模板示例',
content: '这是在 Vue 中使用 template 标签的示例'
}
}
}
</script>


2. 作为条件渲染或循环渲染的包装器

Vue 的 v-ifv-else-ifv-else 和 v-for 指令可以直接用在 <template> 标签上,作为逻辑块的包装器而不引入额外的 DOM 元素:

<template>
<div>
<template v-if="showHeader">
<h1>标题</h1>
<p>副标题</p>
</template><ul>
<template v-for="item in items" :key="item.id">
<li>{{ item.name }}</li>
<li class="divider"></li>
</template>
</ul>
</div>
</template>

3. 作为插槽内容的容器

在组件中使用插槽时,<template> 可以配合 v-slot 指令使用:

<!-- 子组件 -->
<template>
<div>
<slot name="header"></slot>
<slot></slot>
<slot name="footer"></slot>
</div>
</template><!-- 父组件使用 -->
<child-component>
<template v-slot:header>
<h1>这是头部</h1>
</template><p>这是默认插槽内容</p><template v-slot:footer>
<p>这是页脚</p>
</template>
</child-component>

4. 与 Vue 的 <template> 标签和原生 <template> 的区别

  • Vue 的 <template> 是虚拟 DOM 的一部分,会被 Vue 的模板编译器处理
  • 原生 HTML <template> 是浏览器原生支持的,内容不会被渲染直到通过 JavaScript 克隆
  • 在 Vue 单文件组件中,<template> 默认是 Vue 的模板语法,除非特别指定为原生模板

5. 在 Vue 3 中使用 <template> 配合片段支持

Vue 3 支持多根节点的组件(片段),这使得 <template> 可以直接包含多个同级元素:

<template>
<header></header>
<main></main>
<footer></footer>
</template>

注意事项

  1. 在 Vue 单文件组件中,<template> 必须有一个根元素(Vue 2)或可以有多根元素(Vue 3)
  2. Vue 的模板语法会编译 <template> 中的内容,所以不能直接使用原生 <template> 的功能
  3. 如果需要使用原生 <template> 的功能,需要显式声明:
    <template>
    <div>
    <template native>
    <!-- 这里的内容会作为原生模板处理 -->
    </template>
    </div>
    </template>


    在大多数 Vue 开发场景中,你主要使用的是 Vue 的模板语法而不是原生 HTML <template> 的功能。

相关文章:

  • 基于Kubernetes的Apache Pulsar云原生架构解析与集群部署指南(下)
  • FastExcel 本地开发和Linux上上传Resource文件的差异性
  • kotlin JvmName注解的作用和用途
  • 游戏引擎学习第264天:将按钮添加到分析器
  • VTK|.obj文件数据处理+Jet/Viridis/CoolToWarm/Grayscale/Rainbow/风格颜色渲染
  • 如何使用极狐GitLab 软件包仓库功能托管 helm chart?
  • 实践005-Gitlab CICD全项目整合
  • Java并发编程几个问题的解答
  • 在登录页面上添加验证码
  • 超详细!RxSwift 中的 BehaviorRelay 使用教程(含原理 + 示例 + 实战)
  • NetSuite 如何得到所有Item最近一次采购订单的货品单价?
  • 不再踩坑!React.memo正确用法及性能优化实战
  • AI时代企业应用系统架构的新思路与CIO变革指南
  • 21、魔法传送阵——React 19 文件上传优化
  • 轻量级证件照制作 AI 工具 HivisionIDPhotos 介绍
  • 单片机自动排列上料控制程序 下
  • DSP28335 串口中断收发及FIFO使用
  • 剖析 FFmpeg:从基本功能到过滤器,实现音视频处理的灵活性
  • 国内云内网接入方案
  • JAVA房屋租售管理系统房屋出租出售平台房屋销售房屋租赁房屋交易信息管理源码
  • 硅料巨亏后弘元绿能割肉求生:逾12亿元内蒙古公司股权转让协鑫
  • 洞天寻隐·学林纪丨玉洞桃源:仇英青绿山水画中的洞天与身体
  • 国家主席习近平同普京总统举行小范围会谈
  • 谜语的强制力:弗洛伊德与俄狄浦斯
  • 美联储如期按兵不动,强调“失业率和通胀上升的风险均已上升”(声明全文)
  • 暴雨蓝色预警:南方开启较强降雨过程