
标题 | 详情 |
|---|---|
作者简介 | 愚公搬代码 |
头衔 | 华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。 |
近期荣誉 | 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。 |
博客内容 | .NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。 |
欢迎 | 👍点赞、✍评论、⭐收藏 |
基于 Vue 的模板语法深入探讨了 Vue 框架中的模板插值、模板指令等关键技术,并详细介绍了如何利用 Vue 实现组件的条件渲染和循环渲染。这些内容构成了Vue 框架的核心部分,仅仅掌握这些技术,便能在前端网页开发中显著提升效率。
Vue 通过响应式系统实现组件与数据之间的双向绑定。在 Vue 中,当数据发生变化时,组件会自动更新。其核心机制基于 “数据劫持” 和 “依赖追踪”。接下来,我们详细解析 Vue 是如何实现这一绑定的。
Vue 3 使用 Proxy 实现响应式数据绑定,而 Vue 2 使用了 Object.defineProperty 进行数据劫持。Vue 的响应式系统主要包括以下过程:
{{}} 模板语法或 v-bind 指令将数据绑定到视图。示例:
<div>{{ message }}</div> <!-- message 值变化时,视图会自动更新 -->v-model 指令实现双向绑定。双向绑定意味着数据在组件与视图之间可以同步更新。示例:
<input v-model="inputValue" />
<p>当前输入:{{ inputValue }}</p>inputValue 会更新;反之,inputValue 的改变也会同步到输入框中。 ref 创建响应式数据ref 是 Vue 3 中用于创建基本类型数据的响应式容器。它会自动监听其值的变化,并触发组件的更新。
示例:
import { ref } from 'vue';
const counter = ref(0);
const increment = () => {
counter.value++;
};ref 返回一个对象,其值保存在 .value 属性中。 reactive 创建响应式对象对于复杂对象,Vue 3 使用 reactive 将对象转换为响应式数据。
示例:
import { reactive } from 'vue';
const state = reactive({
count: 0,
message: 'Hello Vue'
});reactive 将整个对象包裹,使其内部的所有属性都变为响应式。Dep 和 Watcher(Vue 2)或 effect(Vue 3)来管理。简单模拟实现:
let activeEffect = null;
function reactive(target) {
const handler = {
get(obj, key) {
if (activeEffect) {
// 记录依赖
track(obj, key);
}
return obj[key];
},
set(obj, key, value) {
obj[key] = value;
// 触发更新
trigger(obj, key);
return true;
}
};
return new Proxy(target, handler);
}
function track(obj, key) {
console.log(`依赖追踪: ${key}`);
}
function trigger(obj, key) {
console.log(`触发更新: ${key}`);
}Vue 将模板解析为 虚拟 DOM(VNode),并在首次渲染时将虚拟 DOM 与真实 DOM 绑定在一起。当数据发生变化时,Vue 会通过比较新旧虚拟 DOM(diff 算法),更新发生变化的部分,而不会重新渲染整个页面。
ref 和 reactive 创建响应式数据,并通过 v-model 实现双向绑定。通过这些机制,Vue 实现了组件和数据之间的动态绑定,使开发者能够更高效地构建响应式用户界面。
在 Vue 中,v-if 和 v-show 都是用于条件渲染的指令,但它们的实现方式和使用场景有所不同。
v-ifv-if 用于根据条件决定是否创建和销毁元素。
示例:
<div v-if="isVisible">显示内容</div>isVisible 为 true 时,div 元素将被创建;为 false 时,div 元素将从 DOM 中完全移除。 v-showv-show 通过控制元素的 CSS display 样式来实现元素的显示或隐藏。
示例:
<div v-show="isVisible">显示内容</div>display 样式: 当 isVisible 为 true 时,div 的 display 样式为 block;为 false 时,display 样式为 none。特性 |
|
|
|---|---|---|
实现方式 | 通过创建/销毁 DOM 元素 | 通过切换 CSS |
性能开销 | 较高:创建和销毁 DOM 有性能开销 | 较低:仅改变 CSS,不涉及 DOM 操作 |
首次渲染 | 当条件为 | 元素会被渲染,但初始状态为隐藏 |
适用场景 | 条件变化不频繁,或需要大量 DOM 操作 | 条件变化频繁,需要快速切换显示状态 |
v-if: v-show: 通过理解这两者的区别,可以根据具体的性能和渲染需求选择合适的条件渲染方式。
在 Vue 中,模板插值是将数据插入到 HTML 模板中的一种方式,通常通过双大括号 {{}} 的语法来使用。模板插值允许将 Vue 实例中的数据动态地显示在页面上。
示例:
<div>{{ message }}</div>message 是 Vue 组件中的一个变量,插值会将 message 的值插入到页面中,并渲染为普通文本。Vue 允许在插值中使用 JavaScript 表达式:
<div>{{ message.toUpperCase() }}</div>
<div>{{ 1 + 1 }}</div>Vue 的模板插值默认是安全的,即插值内容会被作为纯文本处理,不会解释为 HTML,从而防止 XSS(跨站脚本攻击)。但 Vue 也提供了插入 HTML 的功能,通过使用 v-html 指令。
v-html 可以将 HTML 代码作为内容插入,并将其解析为真正的 HTML 元素。
示例:
<div v-html="htmlContent"></div>htmlContent 是 Vue 实例中的变量,假设其值为 <strong>加粗的文本</strong>,那么在页面中会被渲染为加粗的文本。v-html 直接插入 HTML 存在 XSS 攻击的风险,因此使用时应确保插入的内容是可信的,或进行必要的过滤。{{}}):将内容作为纯文本处理,不会解析为 HTML。v-html:允许直接插入和解析 HTML 内容,但使用时需要小心安全风险。<div>{{ message }}</div> <!-- 纯文本显示,不解析为HTML -->
<div v-html="htmlContent"></div> <!-- 解析为HTML并插入 -->假设 Vue 实例中的数据如下:
const app = Vue.createApp({
data() {
return {
message: "<strong>不会加粗的文本</strong>",
htmlContent: "<strong>加粗的文本</strong>"
}
}
}).mount('#app')div 会显示 "<strong>不会加粗的文本</strong>",因为它是通过模板插值显示纯文本。div 会显示 加粗的文本,因为 v-html 解析了 HTML 标签并将其作为真实的 DOM 元素插入。{{}} 进行模板插值时,数据会作为纯文本处理,无法解析 HTML 标签。v-html,但要谨慎以防安全风险,例如 XSS 攻击。🚀二、创建一个简单的 Vue 模板任务要求
参考练习步骤
<div> 元素,设置其 id 为 app,作为 Vue 应用的挂载点。<script> 标签内,创建 Vue 实例,定义 username 和 password 数据属性。login 方法,处理登录逻辑。v-model 指令,实现数据双向绑定。login 方法。参考示例代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue Template Exercise</title>
<!-- 引入 Vue 库 -->
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<!-- 创建 Vue 应用的挂载点 -->
<div id="app">
<h1>Login Form</h1>
<!-- 使用 Vue 模板语法创建输入框和“登录”按钮 -->
<label for="username">Username:</label>
<input type="text" id="username" v-model="username" required>
<br>
<label for="password">Password:</label>
<input type="password" id="password" v-model="password" required>
<br>
<!-- 为“登录”按钮添加事件监听器 -->
<button @click="login">Login</button>
<p>{{ message }}</p>
</div>
<script>
const { createApp, ref } = Vue;
const App = {
setup() {
// 使用 ref 定义响应式变量
const username = ref('');
const password = ref('');
const message = ref('');
// 定义 login 方法
const login = () => {
if (username.value && password.value) {
message.value = 'Logged in successfully!';
} else {
message.value = 'Please enter both username and password.';
}
};
// 返回数据和方法供模板使用
return {
username,
password,
message,
login
};
}
};
// 创建并挂载 Vue 实例到 DOM 元素上
createApp(App).mount('#app');
</script>
</body>
</html>通过本例,你将学习到如何在Vue 中利用模板语法创建简洁的用户界面,并实现基础的用户交互处理。此外,你可以通过扩展这个练习,尝试增加表单验证、错误提示等功能,这将有助于你更深入地理解 Vue 模板的运用。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。