<template>标签的作用,在构建可复用 UI 片段时如何应用?

news2025/3/29 6:04:26

大白话标签的作用,在构建可复用 UI 片段时如何应用

<template>标签的作用

在前端开发里,<template>标签可是个超棒的工具。它就像是一个“代码仓库”,可以把一些 HTML 代码片段存起来,而且这些代码片段在页面刚加载的时候是不会显示出来的。只有当你想用这些代码的时候,才把它们从“仓库”里拿出来,放到页面合适的位置去显示。这样做有啥好处呢?它能让你把一些常用的 UI 片段封装起来,需要的时候直接用,避免了代码的重复编写,提高了开发效率。

在构建可复用 UI 片段时的应用

下面我用一个简单的例子来详细讲讲怎么用<template>标签构建可复用的 UI 片段。假设我们要做一个商品列表,每个商品都有图片、标题和价格,而且这个商品的样式可能在很多地方都会用到,这时候就可以用<template>标签把商品的 HTML 结构封装起来。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Template Example</title>
</head>

<body>
    <!-- 创建一个 template 标签,用来存放商品的 HTML 结构 -->
    <template id="product-template">
        <!-- 商品的容器 -->
        <div class="product">
            <!-- 商品图片,这里用占位图代替 -->
            <img src="https://dummyimage.com/200x200/000/fff" alt="Product Image">
            <!-- 商品标题 -->
            <h2 class="product-title">Product Title</h2>
            <!-- 商品价格 -->
            <p class="product-price">$99.99</p>
        </div>
    </template>

    <!-- 这里是用来显示商品列表的容器 -->
    <div id="product-list"></div>

    <script>
        // 获取 template 元素
        const productTemplate = document.getElementById('product-template');
        // 获取用来显示商品列表的容器
        const productList = document.getElementById('product-list');

        // 模拟一些商品数据
        const products = [
            { title: 'Product 1', price: '$19.99' },
            { title: 'Product 2', price: '$29.99' },
            { title: 'Product 3', price: '$39.99' }
        ];

        // 遍历商品数据
        products.forEach(product => {
            // 克隆 template 里的内容,true 表示深克隆,会把里面所有子元素都克隆
            const clone = document.importNode(productTemplate.content, true);

            // 找到克隆内容里的商品标题元素,并更新标题文本
            const titleElement = clone.querySelector('.product-title');
            titleElement.textContent = product.title;

            // 找到克隆内容里的商品价格元素,并更新价格文本
            const priceElement = clone.querySelector('.product-price');
            priceElement.textContent = product.price;

            // 把克隆好并更新内容的商品添加到商品列表容器里
            productList.appendChild(clone);
        });
    </script>
</body>

</html>

通过这种方式,你就可以用<template>标签构建可复用的 UI 片段啦,需要的时候就克隆一份,然后根据数据更新内容,再添加到页面上。

<template>标签和components(组件)在前端开发里用途有相似之处,不过它们在概念、功能和使用场景等方面存在明显区别,下面为你详细介绍:

<template>标签和components组件的区别是什么?

概念层面

  • <template>标签:它是 HTML 标准里的元素,就像一个“代码仓库”,能够把 HTML 代码片段存储起来,在页面初始加载时这些代码不会显示,只有在需要的时候才会被使用。
  • components组件:这是一种抽象的编程概念,在前端框架(像 Vue、React 等)中经常用到。它把 HTML、CSS、JavaScript 等代码封装在一起,形成一个独立的、可复用的单元。

功能特性

  • <template>标签
    • 内容不可见:页面加载时,<template>标签里的内容不会渲染显示,只有在通过 JavaScript 动态插入到文档中才会显示。
    • 静态结构<template>主要用于存储静态的 HTML 结构,虽然可以通过 JavaScript 动态修改内容,但本身不具备复杂的交互逻辑和状态管理功能。
    • 轻量级:仅包含 HTML 结构,不涉及额外的框架逻辑,使用简单,对性能影响较小。
  • components组件
    • 状态管理:组件可以有自己的状态,并且能根据状态的改变更新视图。例如在 Vue 组件里可以使用data选项来定义状态,在 React 组件中可以用useState Hook 或者类组件的state属性来管理状态。
    • 生命周期管理:组件有自己的生命周期函数,在不同的阶段执行特定的操作。例如在 Vue 组件中有createdmounted等生命周期钩子,在 React 组件中有componentDidMountcomponentWillUnmount等生命周期方法。
    • 事件处理:组件能够定义自己的事件处理逻辑,方便实现交互功能。例如在 Vue 组件里可以使用@click等指令绑定事件,在 React 组件中可以使用onClick属性绑定事件处理函数。

使用场景

  • <template>标签
    • 简单复用:当只需要复用简单的 HTML 结构,不需要复杂的交互和状态管理时,<template>标签是很好的选择。例如复用一个简单的商品卡片、评论框等。
    • 动态插入:需要根据用户的操作动态插入 HTML 片段时,可以使用<template>标签。例如点击按钮后动态添加一个列表项。
  • components组件
    • 复杂交互:在需要实现复杂交互逻辑和状态管理的场景下,组件是首选。例如一个电商网站的购物车组件,需要处理商品的添加、删除、数量修改等操作。
    • 大型项目:在大型前端项目中,使用组件可以提高代码的可维护性和可扩展性。将页面拆分成多个组件,每个组件负责一个特定的功能,便于团队协作开发。

示例对比

<template>标签示例
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Template Example</title>
</head>

<body>
    <!-- 定义一个 template 标签,存储商品卡片的 HTML 结构 -->
    <template id="product-template">
        <div class="product">
            <h2 class="product-title">Product Title</h2>
            <p class="product-price">$99.99</p>
        </div>
    </template>
    <!-- 商品列表容器 -->
    <div id="product-list"></div>

    <script>
        // 获取 template 元素
        const productTemplate = document.getElementById('product-template');
        // 获取商品列表容器
        const productList = document.getElementById('product-list');
        // 模拟商品数据
        const products = [
            { title: 'Product 1', price: '$19.99' },
            { title: 'Product 2', price: '$29.99' }
        ];
        // 遍历商品数据
        products.forEach(product => {
            // 克隆 template 内容
            const clone = document.importNode(productTemplate.content, true);
            // 更新标题和价格
            const titleElement = clone.querySelector('.product-title');
            titleElement.textContent = product.title;
            const priceElement = clone.querySelector('.product-price');
            priceElement.textContent = product.price;
            // 将克隆的内容添加到商品列表中
            productList.appendChild(clone);
        });
    </script>
</body>

</html>
Vue 组件示例
<template>
    <!-- 组件的 HTML 结构 -->
    <div class="product">
        <h2>{{ product.title }}</h2>
        <p>{{ product.price }}</p>
        <button @click="addToCart">Add to Cart</button>
    </div>
</template>

<script>
export default {
    // 组件的属性
    props: {
        product: {
            type: Object,
            required: true
        }
    },
    // 组件的方法
    methods: {
        addToCart() {
            // 模拟添加到购物车的操作
            console.log(`Added ${this.product.title} to cart`);
        }
    }
};
</script>

<style scoped>
/* 组件的样式 */
.product {
    border: 1px solid #ccc;
    padding: 10px;
    margin-bottom: 10px;
}
</style>

综上所述,<template>标签适合简单的 HTML 结构复用和动态插入,而components组件更适合处理复杂的交互逻辑和状态管理,在大型项目中能发挥更大的作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2322262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【江协科技STM32】软件SPI读写W25Q64芯片(学习笔记)

SPI通信协议及S为5Q64简介&#xff1a;【STM32】SPI通信协议&W25Q64Flash存储器芯片&#xff08;学习笔记&#xff09;-CSDN博客 STM32与W25Q64模块接线&#xff1a; SPI初始化&#xff1a; 片选SS、始终SCK、MOSI都是主机输出引脚&#xff0c;输出引脚配置为推挽输出&…

Git+Fork 入门介绍

git 分区理解 fork安装 从路径下去拿软件时&#xff0c;注意先拉到本地。经验来看&#xff0c;fork直接安装会出不可思议的问题。 fork操作 安装&#xff0c;注意设置好名字&#xff0c;如果之前安装的同学&#xff0c;名字没有写好&#xff0c;重新安装设置好名字。 clone操…

Windows系统安装Node.js和npm教程【成功】

0.引言——Node.js和npm介绍 项目描述Node.js基于Chrome V8引擎的JavaScript运行环境&#xff0c;使JavaScript可用于服务器端开发。采用单线程、非阻塞I/O及事件驱动架构&#xff0c;适用于构建Web服务器、实时应用和命令行工具等npmNode.js的包管理器与大型软件注册表。拥有…

Axure RP9.0 教程:左侧菜单列表导航 ( 点击父级菜单,子菜单自动收缩或展开)【响应式的菜单导航】

文章目录 引言I 实现步骤添加商品管理菜单组推拉效果引言 应用场景:PC端管理后台页面,左侧菜单列表导航。 思路: 用到了动态面板的两个交互效果来实现:隐藏/显示切换、展开/收起元件向下I 实现步骤 添加商品管理菜单组 在左侧画布区域添加一个菜单栏矩形框;再添加一个商…

科技赋能|ZGIS综合管网智能管理平台守护地下城市生命线

地下管网作为城市公共安全的重要组成部分&#xff0c;担负着城市的信息传递、能源输送、排涝减灾等重要任务&#xff0c;是维系城市正常运行、满足群众生产生活需要的重要基础设施&#xff0c;是城市各功能区有机连接和运转的维系&#xff0c;因此&#xff0c;也被称为城市“生…

如何保证LabVIEW软件开发的质量?

LabVIEW作为图形化编程工具&#xff0c;广泛应用于工业测控、自动化测试等领域。其开发模式灵活&#xff0c;但若缺乏规范&#xff0c;易导致代码可读性差、维护困难、性能低下等问题。保证LabVIEW开发质量需从代码规范、模块化设计、测试验证、版本管理、文档完善等多维度入手…

如何快速解决 Postman 报错?

介绍一些 Postman 常见的报错与处理方法&#xff0c;希望能够对大家有所帮助。 Postman 一直转圈打不开的问题 Postman 报错处理指南&#xff1a;常见报错与解决方法

C++ 多线程简要讲解

std::thread是 C11 标准库中用于多线程编程的核心类&#xff0c;提供线程的创建、管理和同步功能。下面我们一一讲解。 一.构造函数 官网的构造函数如下&#xff1a; 1.默认构造函数和线程创建 thread() noexcept; 作用&#xff1a;创建一个 std::thread 对象&#xff0c;但…

如何设计一个处理物联网设备数据流的后端系统。

一、系统架构设计 物联网设备数据流的后端系统通常包括以下几个主要组件: ①设备数据采集层:负责从物联网设备收集数据。 ②数据传输层:负责将设备数据传输到后端系统。 ③数据处理层:实时或批量处理传输到后的数据。 ④存储层:负责存储设备数据。 ⑤API层:提供外部…

深入理解 Spring Boot 应用的生命周期:从启动到关闭的全流程解析

引言 Spring Boot 是当今 Java 开发中最流行的框架之一&#xff0c;它以简化配置和快速开发著称。然而&#xff0c;要真正掌握 Spring Boot&#xff0c;理解其应用的生命周期是至关重要的。本文将深入探讨 Spring Boot 应用的生命周期&#xff0c;从启动到关闭的各个阶段&…

【算法笔记】图论基础(一):建图、存图、树和图的遍历、拓扑排序、最小生成树

目录 何为图论图的概念 图的一些基本概念有向图和无向图带权图连通图和非连通图对于无向图对于有向图 度对于无向图对于有向图一些结论 环自环、重边、简单图、完全图自环重边简单图 稀疏图和稠密图子图、生成子图同构 图的存储直接存边邻接矩阵存边邻接表存边链式前向星存边 图…

SpringMVC 请求与响应处理详解

引言 在 Java Web 开发中&#xff0c;SpringMVC 作为 Spring 框架的重要模块&#xff0c;提供了强大的请求和响应处理机制。本文将深入探讨 SpringMVC 中请求和响应的处理方式&#xff0c;结合实际案例&#xff0c;帮助开发者更好地理解和应用这些功能。 一、SpringMVC 请求处…

【python】requests 爬虫高效获取游戏皮肤图

1. 引言 在当今的数字时代&#xff0c;游戏已经成为许多人生活中不可或缺的一部分。而游戏中的皮肤&#xff0c;作为玩家个性化表达的重要方式&#xff0c;更是受到了广泛的关注和喜爱。然而&#xff0c;对于许多玩家来说&#xff0c;获取游戏皮肤往往需要花费大量的时间和精力…

(UI自动化测试web端)第二篇:元素定位的方法_css定位之ID选择器

看代码里的【find_element_by_css_selector( )】( )里的表达式怎么写&#xff1f; 文章介绍了第一种写法id选择器&#xff0c;其实XPath元素定位要比CSS好用&#xff0c;原因是CSS无法使用下标&#xff08;工作当中也是常用的xpath&#xff09;&#xff0c;但CSS定位速度比XPat…

23种设计模式-代理(Proxy)设计模式

代理设计模式 &#x1f6a9;什么是代理设计模式&#xff1f;&#x1f6a9;代理设计模式的特点&#x1f6a9;代理设计模式的结构&#x1f6a9;代理设计模式的优缺点&#x1f6a9;代理设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是代理设计模式…

【react18】react项目使用mock模拟后台接口

前后端分离项目&#xff0c;后端还没有接口的时候&#xff0c;前端可以使用mockjs的技术实行假数据的模拟。这里使用的是mock的库msw实现这个业务. MSW msw是mock的工具&#xff0c;官网地址是在这里 使用步骤 1.安装msw npm install mswlatest --save-dev2.新建存放mock接…

Windows下VSCode的安装

前言 VSCode的安装看起来平平无奇&#xff0c;但也不是轻轻松松的。笔者将最新的Windows下安装VSCode&#xff0c;以及运行最简单的C程序的过程记录下来&#xff0c;供后续的自己和大家参考。 一、官网下载安装包 Visual Studio Code - Code Editing. Redefined 二、安装 直接…

django入门教程之templates和static资源【五】

使用app01子应用举例说明模板的使用。templates官方文档。 templates完整流程认知 第一步&#xff0c;在settings.py中注册app01子应用。 第二步&#xff0c;在app01目录下&#xff0c;新建templates和static目录&#xff0c;用于存放模板文件和资源文件。目录结构如下&#…

【区块链安全 | 第一篇】密码学原理

文章目录 1.哈希函数1.1 哈希函数的性质1.2 常见哈希算法1.3 Merkle Tree&#xff08;默克尔树&#xff09;1.4 HMAC&#xff08;哈希消息认证码&#xff09; 2. 公钥密码学2.1 对称加密 vs 非对称加密2.2 RSA 算法2.3 ECC&#xff08;椭圆曲线密码学&#xff09;2.4 Diffie-He…

Linux安装MySQL数据库并使用C语言进行数据库开发

目录 一、前言 二、安装VMware运行Ubuntu 1.安装VMware 2.使用VMware打开Ubuntu 三、配置VMware使用网卡 1.添加NAT网卡 四、Linux下安装MySQL数据库 五、安装MySQL开发库 六、演示代码 sql_connect.c sql_connect.h main.c中数据库相关代码 结尾 一、前言 由于最…