likes
comments
collection
share

掌握Vue.js指令:打造高效响应式前端体验

作者站长头像
站长
· 阅读数 52

引言

在现代前端开发中,Vue.js 已成为开发者不可或缺的工具。它的简洁性和强大的功能使其在业界广受欢迎。在上一篇呆同学分享关于创建一个Vue项目的文章之后,今天将带领大家一起了解 Vue.js 中的指令及其特性,帮助你轻松掌握这些技巧,有助于后续项目的理解和实现。

Vue.js指令简述

Vue.js 指令(Directives)是以 v- 开头的特殊属性,指令属性的值预期是单一的 JavaScript 表达式(除了 v-for)。指令的职责是当其表达式的值发生改变时,将其产生的连带影响,响应式地作用于 DOM。

接下来我们先来学习了解一下Vue的响应式系统,因为这是我们学习Vue非常重要的一步。

响应式

Vue.js 的响应式系统是其最核心的功能之一,能够让数据和视图保持同步,实现真正的双向数据绑定。在这一部分,我们将一起探讨 Vue.js 的响应式原理、数据绑定机制以及如何使用 refreactive 创建响应式数据。

响应式原理

Vue.js 的响应式是通过“数据劫持”和“依赖追踪”实现的。当我们将一个普通的 JavaScript 对象传递给 Vue 实例的 data 选项时,Vue 会遍历这个对象的所有属性,并使用 Object.defineProperty 将它们转化为 getter 和 setter。这样,当属性被读取或修改时,Vue 能够自动跟踪依赖,并在属性变化时通知相关的页面数据更新。

而 Vue 3 的响应式系统依然基于“数据劫持”和“依赖追踪”,但实现方式更为现代化和高效。Vue 3 使用 Proxy 对象取代了 Vue 2 中的 Object.defineProperty,从而更好地支持数组和其他复杂数据结构。

当我们使用 Vue 3 的组合式 API 创建响应式数据时,Vue 同样会自动追踪数据的依赖关系,并在数据变化时通知相关页面数据进行更新。

例如:

import { createApp } from 'vue';
const app = createApp({
  data() {
    return {
      message: 'Hello Vue 3!'
    }
  }
});
app.mount('#app');
  • import { createApp } from 'vue':从vue库中导入了createApp函数。createApp是Vue 3中的一个全局API,用于创建一个新的Vue应用实例。与Vue 2的new Vue不同,Vue 3使用模块化的方式来管理和创建应用。

  • createApp函数接受一个对象作为参数,这个对象包含了应用的根组件的定义。我们将createApp的返回值赋给常量app,这个返回值是一个应用实例。传递给createApp的对象可以包含以下选项:

    • data():一个函数,返回一个对象,定义了这个应用的初始数据。这里的message是一个初始数据,值为'Hello Vue 3!'
  • mount方法将Vue应用实例挂载到一个DOM元素上。'#app'是选择器字符串,它表示Vue实例将被挂载到页面上ID为app的元素,这是在index.html文件中的div标签。

当Vue应用实例被挂载到这个DOM元素后,Vue会接管这个DOM元素,并根据应用实例的数据、模板和组件来渲染和更新DOM。

数据绑定与自动更新

Vue 3 依旧提供了单向和双向数据绑定机制,通过插值表达式和指令,数据和视图能够保持一致。

  • 单向数据绑定:数据流从数据模型到视图,如 {{ message }}v-bind
  • 双向数据绑定:数据和视图之间可以相互影响,主要通过 v-model 指令实现。

例如,使用 v-model 可以实现输入框与数据的双向绑定:

<input v-model="message" />
<p>{{ message }}</p>

当输入框的内容改变时,message 也会相应地更新,反之亦然。

ref 和 reactive

在 Vue 3 中,refreactive 是创建响应式数据的两种主要方式。

1. ref

ref 用于创建一个包含单一值的响应式引用。它返回一个包含该值的对象,这个对象有一个 value 属性指向实际的值。引用如下:

import { ref } from 'vue';
const message = ref('Hello Vue!');

可以直接使用 message,Vue 会自动解包 ref 的值:

<p>{{ message }}</p>

只有更改 message.value 才会自动更新视图,不能只更新message

message.value = 'Hello World!';

2. reactive

reactive 用于创建一个响应式对象。它接收一个普通的对象并返回这个对象的响应式代理。引用和ref相同:

import { reactive } from 'vue';
const state = reactive({
  count: 0,
  message: 'Hello Vue!'
});

直接使用 state 对象即可:

<p>{{ state.message }}</p>
<p>{{ state.count }}</p>

修改 state 对象的属性也会自动更新视图:

state.count++;
state.message = 'Hello World!';

对上述的内容我们通过一个具体的例子来演练一下:

<template>
    <div>
        <div>
            账号:<input type="text" v-model="state.username">
        </div>
        <div>
            密码:<input type="text" v-model="state.password">
        </div>
        <button @click="login">登录</button>
    </div>
</template>

<script setup>
    import { ref, reactive } from 'vue'
    const state = reactive({    
        username: '',
        password: ''
    })
    const login = () => {
        console.log(state);
    }
</script>
<style lang="css" scoped>
</style>

当input中输入的值发生变化时,state中的对应值也会发生变化。以上代码展示了如何使用 reactiveref 创建响应式数据,以及如何在模板中绑定和更新这些数据。通过这种方式,开发者可以更高效地管理状态和交互,提升应用的响应性能和用户体验。

插值表达式与 v-html 指令

Vue.js 提供了强大的模板语法,通过插值表达式和 v-html 指令,可以轻松实现数据绑定和动态渲染 HTML 内容。接下来,我们将一起来学习插值表达式的基本用法、插值表达式与 HTML 标签的结合使用,以及 v-html 指令的用法及注意事项。

基本用法

插值表达式的基本语法是使用双大括号 {{ }} 包裹一个 JavaScript 表达式。Vue.js 会自动解析这个表达式,并将结果渲染到 DOM 中。在上面的响应式介绍中有用到。

插值表达式不仅可以绑定简单的字符串,还可以进行各种 JavaScript 操作,例如:

<template>
  <p>计算结果:{{ 1 + 1 }}</p>
  <p>方法调用:{{ greet('呆同学') }}</p>
  <p>三元运算符:{{ isTrue ? 'Yes' : 'No' }}</p>
</template>

<script setup>
import { ref } from 'vue';
const isTrue = ref(true);
const greet = (name) => `Hello, ${name}!`;
</script>

// html渲染:
//计算结果:2
//方法调用:Hello, 呆同学!
//三元运算符:Yes

插值表达式与 HTML 标签

有时候,我们需要在插值表达式中插入 HTML 代码,这时候可以使用 v-html 指令。但需要注意的是,使用 v-html 可能会带来 XSS 攻击的风险,因此在使用时要确保插入的内容是可信的。

<template>
  <div>
    <p>{{ plainText }}</p>
    <div v-html="htmlContent"></div>
  </div>
</template>

<script setup>
import { ref } from 'vue';
const plainText = ref('这是普通文本');
const htmlContent = ref('<strong>这是加粗的HTML内容</strong>');
</script>

掌握Vue.js指令:打造高效响应式前端体验

在上述代码中,plainText 通过插值表达式被直接渲染为文本内容,而 htmlContent 使用 v-html 指令渲染为 HTML 内容。

需要特别注意的是,使用 v-html 时,Vue 不会对插入的 HTML 内容进行任何的转义,因此一定要确保这些内容是安全的。

v-bind 指令

v-bind 指令是 Vue.js 中用于绑定 HTML 属性的核心指令之一。通过 v-bind,我们可以将数据绑定到元素的属性上,实现属性的动态更新。接下来,我们将一起学习 v-bind 指令的基本用法、动态绑定类名和样式,以及事件绑定。

基本用法:绑定属性

v-bind 指令的基本用法是将数据绑定到 HTML 元素的属性上。

语法为 v-bind:attribute="value",也可以使用简写形式 :attribute="value"

<template>
  <div>
    <img :src="imageUrl" alt="Example Image">
  </div>
</template>

<script setup>
import { ref } from 'vue';
const imageUrl = ref('https://example.com/image.jpg');
</script>

<style lang="css" scoped></style>

在上述示例中,imageUrl 的值会被绑定到 <img> 元素的 src 属性上,随着 imageUrl 的变化自动更新。

动态绑定类名和样式

使用 v-bind 指令,我们可以动态绑定元素的类名和内联样式。

动态绑定类名

可以通过对象语法或数组语法动态绑定类名:

<template>
  <div>
    <div :class="{ active: isActive, 'text-danger': hasError }">动态类名</div>
    <div :class="classObject">对象语法</div>
    <div :class="[isActive ? 'active' : '', hasError ? 'text-danger' : '']">数组语法</div>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const isActive = ref(true);
const hasError = ref(false);
const classObject = ref({
  active: isActive.value,
  'text-danger': hasError.value
});
</script>

<style lang="css" scoped>
.active {
  font-weight: bold;
}
.text-danger {
  color: red;
}
</style>

动态绑定样式

<template>
  <div>
    <div :style="{ color: activeColor, fontSize: fontSize + 'px' }">动态样式</div>
    <div :style="styleObject">对象语法</div>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const activeColor = ref('blue');
const fontSize = ref(14);
const styleObject = ref({
  color: activeColor.value,
  fontSize: fontSize.value + 'px'
});
</script>

<style lang="css" scoped></style>

在上述示例中,通过 v-bind:style 动态绑定元素的内部样式,实现样式的动态更新。

事件绑定:v-bind和 @click

除了属性绑定外,v-bind 还可以用于事件绑定,语法为 v-bind:event="handler" 或简写形式 @event="handler"

<template>
  <div>
    <button @click="handleClick">点击我</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const handleClick = () => {
  console.log('点击成功');
};
</script>

<style lang="css" scoped></style>

在上述示例中,按钮的点击事件通过 @click 绑定到 handleClick 方法,当按钮被点击时会输出'点击成功'

条件渲染与循环渲染

在 Vue.js 中,条件渲染和循环渲染是构建动态应用程序的两个重要方面。通过条件渲染,我们可以根据不同的条件来显示或隐藏内容;通过循环渲染,我们可以高效地渲染列表数据。接下来,我们将一起来学习条件渲染中的 v-ifv-elsev-show 及其应用场景和性能对比,以及循环渲染中的 v-for 指令和结合 key 属性的高效渲染。

条件渲染

v-if 和 v-else

v-if 指令用于条件渲染,当条件为真时渲染元素,为假时不渲染。v-else 指令用于 v-if 的 else 分支,当 v-if 的条件为假时渲染元素。

<template>
  <div>
    <p v-if="isVisible">内容可见</p>
    <p v-else>内容不可见</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';
const isVisible = ref(true);
</script>

<style lang="css" scoped></style>

v-show 的区别与应用场景

v-show 指令也用于条件渲染,但不同于 v-ifv-show 只是通过 CSS 的 display 属性来控制元素的显示和隐藏,而不会移除或销毁元素。

<template>
  <div>
    <p v-show="isVisible">内容可见</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';
const isVisible = ref(true);
</script>

<style lang="css" scoped></style>

应用场景

  • v-if 适用于在条件不满足时不需要渲染该部分的场景,因为它会真正地销毁和重新创建元素。
  • v-show 适用于频繁切换显示状态的场景,因为它只是简单地切换 display 属性,不会销毁和重新创建元素。

条件指令的性能对比

  • v-if 有更高的切换开销,因为条件切换时会销毁和重新创建 DOM 元素。
  • v-show 切换开销较小,因为只是简单地控制元素的显示和隐藏,不会销毁和重新创建 DOM 元素。

循环渲染

v-for 指令

v-for 指令用于循环渲染列表数据,语法为 v-for="item in items"

<template>
  <ul>
    <li v-for="(item, index) in items" :key="index">{{ item }}</li>
  </ul>
</template>

<script setup>
import { ref } from 'vue';
const items = ref(['苹果', '香蕉', '橙子']);
</script>

<style lang="css" scoped></style>

掌握Vue.js指令:打造高效响应式前端体验

在上述示例中,items 数组中的每个元素都会被渲染为一个 <li> 元素。

结合 key 属性的高效渲染

在使用 v-for 渲染列表时,最好为每个列表项提供一个唯一的 key 值,以便 Vue.js 能够高效地更新和复用 DOM 元素。

<template>
  <ul>
    <li v-for="item in items" :key="item.id">{{ item.name }}</li>
  </ul>
</template>

<script setup>
import { ref } from 'vue';
const items = ref([
  { id: 1, name: '苹果' },
  { id: 2, name: '香蕉' },
  { id: 3, name: '橙子' }
]);
</script>

<style lang="css" scoped></style>

在上述示例中,每个 item 都有一个唯一的 id,并将其作为 key 值传递给每个 <li> 元素,确保高效渲染。

常用指令

Vue.js 提供了许多实用的指令,用于简化数据绑定、事件处理和组件间的内容分发。这里我们先简单学习了解一下 v-modelv-on指令的基本用法及其应用场景,未来我们将会在实战中用到。

v-model:双向数据绑定

v-model 指令用于在表单控件和数据之间创建双向数据绑定。它可以用于 <input><textarea><select> 等表单元素,使得用户输入的值可以自动更新到数据,并且数据的变化也会自动反映到表单元素上。

<template>
  <div>
    <input v-model="message" placeholder="输入一些内容">
    <p>您输入的内容是:{{ message }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';
const message = ref('');
</script>

<style lang="css" scoped></style>

v-model 指令绑定了 message 数据,输入框的内容与 message 实现了双向绑定。

复选框、单选框和选择框:

<template>
  <div>
    <label>
      <input type="checkbox" v-model="isChecked"> 选中我
    </label>
    <p>复选框状态:{{ isChecked }}</p>

    <label>
      <input type="radio" value="A" v-model="picked"> 选项 A
    </label>
    <label>
      <input type="radio" value="B" v-model="picked"> 选项 B
    </label>
    <p>选择的选项:{{ picked }}</p>

    <select v-model="selected">
      <option disabled value="">请选择</option>
      <option>A</option>
      <option>B</option>
      <option>C</option>
    </select>
    <p>选择的值:{{ selected }}</p>
  </div>
</template>

<script setup>
import { ref } from 'vue';
const isChecked = ref(false);
const picked = ref('');
const selected = ref('');
</script>

<style lang="css" scoped></style>
掌握Vue.js指令:打造高效响应式前端体验

v-on:事件处理

v-on 指令用于监听 DOM 事件,并在触发时执行指定的 JavaScript 方法。可以使用 v-on:event="handler" 或简写形式 @event="handler"

基本用法

基本用法同上述讲到的的事件绑定:v-bind和 @click相同。

传递事件参数

<template>
  <div>
    <button @click="handleClick('Hello')">点击我</button>
  </div>
</template>

<script setup>
import { ref } from 'vue';
const handleClick = (message) => {
  console.log(`按钮被点击了,消息:${message}`);
};
</script>

<style lang="css" scoped></style>
// 控制台输出:按钮被点击了,消息:Hello

事件修饰符

Vue.js 提供了多种事件修饰符,用于简化常见的事件处理模式,例如 .prevent.stop.capture.self 等。

<template>
  <div>
    <form @submit.prevent="handleSubmit">
      <button type="submit">提交</button>
    </form>
  </div>
</template>

<script setup>
import { ref } from 'vue';
const handleSubmit = () => {
  console.log('表单提交被阻止');
};
</script>

<style lang="css" scoped></style>
// 控制台输出:表单提交被阻止

总结

今天,我们一起学习了解了 Vue.js 中的一些常用指令及其应用场景,包括插值表达式、条件渲染、循环渲染、响应式系统、双向数据绑定、事件处理和插槽机制。通过这些指令,Vue.js 提供了一种简洁而强大的方式来处理数据和 DOM 操作,使得开发复杂的前端应用变得更加容易和高效。下面我用一个表格归纳一下:

章节知识点描述
插值表达式基本用法使用双大括号 {{ }} 绑定数据。
插值表达式与 HTML 标签在插值表达式中可以嵌套 HTML 标签。
v-html 指令动态渲染 HTML 内容,注意防范 XSS 攻击。
条件渲染v-if 和 v-else条件渲染,根据条件动态创建或销毁元素。
v-show条件渲染,通过 CSS 的 display 属性控制元素显示或隐藏。
条件指令的性能对比v-if 切换开销较大,v-show 切换开销较小。
循环渲染v-for 指令循环渲染列表数据。
结合 key 属性的高效渲染提供唯一 key 值,确保高效更新和复用 DOM 元素。
响应式系统ref 和 reactive创建响应式数据,ref 用于基本类型,reactive 用于对象。
Vue.js 的响应式原理通过依赖追踪和通知机制实现数据的自动更新。
数据绑定与自动更新数据变化自动更新到视图上。
双向数据绑定v-model 指令在表单控件和数据之间创建双向数据绑定。
复选框、单选框和选择框适用于多种表单控件类型,实现数据的双向绑定。
事件处理v-on 指令监听 DOM 事件,并在触发时执行指定方法。
传递事件参数事件处理函数中传递参数。
事件修饰符.prevent、.stop 等修饰符简化常见事件处理模式。

掌握Vue.js指令:打造高效响应式前端体验

转载自:https://juejin.cn/post/7390319475520929844
评论
请登录