Vue指令基础要素完整指南

概述
本文是Vue前端开发入门系列的第8部分,专注于Vue指令的基础要素。让我们学习Vue模板中经常使用的指令,这些指令为HTML元素添加特殊功能。
Vue指令基础要素一览
指令
简写
说明
示例
v-bind
:
将数据绑定到HTML属性
<img :src="imageUrl">
v-model
表单元素与数据双向绑定
<input v-model="userName">
v-on
@
监听事件并执行处理
<button @click="handleClick">
v-if
根据条件切换元素的显示/隐藏(DOM删除)
<p v-if="showMessage">
v-show
根据条件切换元素的显示/隐藏(CSS display: none)
<p v-show="showMessage">
v-for
重复渲染列表元素
<li v-for="item in items" :key="item.id">
Vue指令基础要素详解
v-bind
将响应式数据绑定到HTML属性。
简写::
示例:将图片URL绑定到src属性,将动态CSS类绑定到class属性。
  1. <template>
  2. <img :src="imageUrl" :alt="imageAlt" :class="{ 'active': isActive }">
  3. template>

  4. <script setup>
  5. import { ref } from 'vue'

  6. const imageUrl = 'https://example.com/image.jpg'
  7. const imageAlt = '示例图片'
  8. const isActive = ref(true)
vue
v-model
将表单元素(<input><textarea><select>等)与JavaScript数据进行双向绑定。输入内容会自动反映到数据中,数据变化时输入框也会相应更新。
  1. <template>
  2. <input type="text" v-model="userName">
  3. <p>输入的名字: {{ userName }}p>
  4. template>

  5. <script setup>
  6. import { ref } from 'vue'

  7. const userName = ref('')
  8. script>
vue
v-on
监听DOM事件(点击、输入等),当事件发生时执行JavaScript方法。
简写:@
  1. <template>
  2. <button @click="handleClick">请点击button>
  3. template>

  4. <script setup>
  5. const handleClick = () => {
  6. alert('按钮被点击了!')
  7. }
  8. script>
vue
v-if / v-else-if / v-else
根据条件切换元素的显示/隐藏。当条件为false时,元素会从DOM中完全删除。
  1. <template>
  2. <button @click="toggleMessage">消息显示/隐藏button>
  3. <p v-if="showMessage">你好!消息正在显示。p>
  4. <p v-else>消息已隐藏。p>
  5. template>

  6. <script setup>
  7. import { ref } from 'vue'

  8. const showMessage = ref(true)
  9. const toggleMessage = () => {
  10. showMessage.value = !showMessage.value
  11. }
  12. script>
vue
v-show
v-if类似,用于切换元素的显示/隐藏,但当条件为false时,元素仍保留在DOM中,只是应用CSS的display: none;。对于频繁切换的情况比v-if更高效,但实际用途可能比v-if少。
  1. <template>
  2. <p v-show="showMessage">这是用v-show显示的内容。p>
  3. template>
vue
v-for
根据数组数据重复渲染元素。
  1. <template>
  2. <ul>
  3. <li v-for="(item, index) in items" :key="index">
  4. {{ index }}: {{ item }}
  5. li>
  6. ul>
  7. template>

  8. <script setup>
  9. import { ref } from 'vue'

  10. const items = ref(['苹果', '香蕉', '橙子'])
  11. script>
vue
key属性的重要性使用v-for时,为元素添加:key属性非常重要的key用于唯一标识每个元素,Vue用它来高效地处理元素的添加、删除和重新排序。通常指定数据的ID等唯一且稳定的值。
实际应用示例
1. 动态样式绑定
  1. <template>
  2. <div>
  3. <button
  4. :class="{
  5. 'btn-primary': isPrimary,
  6. 'btn-secondary': !isPrimary
  7. }"
  8. @click="toggleStyle"
  9. >
  10. 切换样式
  11. button>
  12. <div :style="{
  13. color: textColor,
  14. fontSize: fontSize + 'px'
  15. }">
  16. 动态样式文本
  17. div>
  18. div>
  19. template>

  20. <script setup>
  21. import { ref } from 'vue'

  22. const isPrimary = ref(true)
  23. const textColor = ref('blue')
  24. const fontSize = ref(16)

  25. const toggleStyle = () => {
  26. isPrimary.value = !isPrimary.value
  27. textColor.value = isPrimary.value ? 'blue' : 'red'
  28. fontSize.value = isPrimary.value ? 16 : 20
  29. }
  30. script>
vue
2. 表单处理
  1. <template>
  2. <form @submit.prevent="handleSubmit">
  3. <div>
  4. <label>用户名:label>
  5. <input
  6. v-model="formData.username"
  7. type="text"
  8. required
  9. >
  10. div>
  11. <div>
  12. <label>邮箱:label>
  13. <input
  14. v-model="formData.email"
  15. type="email"
  16. required
  17. >
  18. div>
  19. <div>
  20. <label>兴趣:label>
  21. <select v-model="formData.interests" multiple>
  22. <option value="reading">阅读option>
  23. <option value="music">音乐option>
  24. <option value="sports">运动option>
  25. select>
  26. div>
  27. <button type="submit">提交button>
  28. form>
  29. <div v-if="submitted">
  30. <h3>提交的数据:h3>
  31. <pre>{{ JSON.stringify(formData, null, 2) }}pre>
  32. div>
  33. template>

  34. <script setup>
  35. import { ref, reactive } from 'vue'

  36. const formData = reactive({
  37. username: '',
  38. email: '',
  39. interests: []
  40. })

  41. const submitted = ref(false)

  42. const handleSubmit = () => {
  43. submitted.value = true
  44. console.log('表单数据:', formData)
  45. }
  46. script>
vue
3. 列表渲染和条件渲染
  1. <template>
  2. <div>
  3. <h2>任务列表h2>
  4. <div>
  5. <input
  6. v-model="newTask"
  7. @keyup.enter="addTask"
  8. placeholder="输入新任务"
  9. >
  10. <button @click="addTask">添加button>
  11. div>
  12. <ul>
  13. <li
  14. v-for="task in filteredTasks"
  15. :key="task.id"
  16. :class="{ 'completed': task.completed }"
  17. >
  18. <input
  19. type="checkbox"
  20. v-model="task.completed"
  21. >
  22. <span v-if="!task.completed">{{ task.text }}span>
  23. <span v-else style="text-decoration: line-through;">
  24. {{ task.text }}
  25. span>
  26. <button @click="removeTask(task.id)">删除button>
  27. li>
  28. ul>
  29. <div>
  30. <button @click="filter = 'all'">全部button>
  31. <button @click="filter = 'active'">进行中button>
  32. <button @click="filter = 'completed'">已完成button>
  33. div>
  34. <p v-show="tasks.length === 0">暂无任务p>
  35. div>
  36. template>

  37. <script setup>
  38. import { ref, computed } from 'vue'

  39. const tasks = ref([])
  40. const newTask = ref('')
  41. const filter = ref('all')

  42. const filteredTasks = computed(() => {
  43. switch (filter.value) {
  44. case 'active':
  45. return tasks.value.filter(task => !task.completed)
  46. case 'completed':
  47. return tasks.value.filter(task => task.completed)
  48. default:
  49. return tasks.value
  50. }
  51. })

  52. const addTask = () => {
  53. if (newTask.value.trim()) {
  54. tasks.value.push({
  55. id: Date.now(),
  56. text: newTask.value,
  57. completed: false
  58. })
  59. newTask.value = ''
  60. }
  61. }

  62. const removeTask = (id) => {
  63. const index = tasks.value.findIndex(task => task.id === id)
  64. if (index > -1) {
  65. tasks.value.splice(index, 1)
  66. }
  67. }
  68. script>
vue
指令使用技巧
1. 性能优化
v-if vs v-show
使用v-if当条件很少改变时
使用v-show当条件频繁切换时
v-for优化
始终使用:key属性
避免在v-for中使用复杂表达式
考虑使用v-memo进行缓存
2. 事件处理
  1. <template>
  2. <input @keyup.enter="onEnter">
  3. <form @submit.prevent="onSubmit">
  4. <div @click.stop="onClick">
  5. template>
vue
3. 动态属性
  1. <template>
  2. <div :[attributeName]="attributeValue">
  3. <div :class="[baseClass, { active: isActive }]">
  4. <div :style="[baseStyle, dynamicStyle]">
  5. template>
vue
总结
通过掌握这些Vue指令,您可以充分利用Vue强大的数据绑定和响应式UI构建的优势。这些指令是Vue开发的基础,掌握它们将大大提高您的开发效率。
记住:
合理使用v-ifv-show
始终为v-for提供:key
善用指令的简写形式
注意性能优化