Vue.js基础指令

306 阅读2分钟

Vue.js基础指令

指令的本质就是HTML自定义属性。vue.js的指令就是以v-开头的自定义属性。

v-once指令

使元素内部的插值表达式只生效一次。

<div id="app">
  <p v-once>{{content}}</p>
</div>

v-text指令

元素内容整体替换为指定纯文本内容。值为data选项中的变量,也可以是固定数值,但那没有意义。和插值表达式一样,也会自动更新视图。

<div id="app">
  <p v-text="content">被覆盖的内容</p>
</div>

v-html指令

元素内容整体替换为指定的HTML文本内容

<div id="app">
  <p v-html="content">被覆盖的内容</p>
</div>

v-bind指令

用于动态绑定HTML属性。

<div id="app">
  <!-- 通过v-bind指令和data选项中的title变量来动态设置title属性内容 -->
  <p v-bind:title="title">内容</p>
  <!-- 简写形式 -->
  <p :title="title">内容</p>
  <!-- 和插值表达式一样,也可使用语句 -->
  <p :title="title + 2">内容</p>
  <!-- 绑定多个属性,只需要绑定包含这些属性的对象即可 -->
  <p v-bind="attrObj">内容</p>
</div>
<!-- CDN引入最新稳定版vue.js  -->
<script src="https://cdn.jsdelivr.net/npm/vue"></script> 
<script>
  const vm = new Vue({
    el: '#app',
    data: {
      title: '这是title属性内容',
      attrObj: {
        id: 'aa',
        title: 'bb',
        // javascript不支持带短横线-的键,需要用字符串表示
        'data-content': 'cc'
      }
    }
  })
</script>

Class绑定

class是HTML属性,可以通过v-bind指令动态绑定,且绑定后可以与固有class属性共存。

<div id="app">
  <!-- pStyle为data选项中的字符串类型变量 -->
  <p :class="pStyle">内容</p>
  <!-- x为类名,绑定的类名可与其共存 -->
  <p class="x" :class="pStyle">内容</p>
  <!-- 多类名动态绑定 -->
  <!-- x、y、z为类名,isY、isZ为data选项中的bool类型变量 -->
  <p :class="isY ? 'x y z' : 'x z'">内容</p>
  <!-- 对象形式的多类名动态绑定 -->
  <p :class="{ x: true, y: isY, z: isZ }">内容</p>
  <!-- 数组形式的多类名动态绑定 -->
  <p :class="['x', {y: isY}, 'z']">内容</p>
</div>

Style绑定

style是HTML属性,可以通过v-bind指令动态绑定,且绑定后可以与固有style属性共存。

<div id="app">
  <!-- style绑定, styleObj1为data选项中的对象类型变量 -->
  <p :style="styleObj1">内容</p>
  <p style="width: 100px;" :style="styleObj1">内容</p>
  <!-- 数组形式的多样式绑定, baseStyleObj、styleObj1、styleObj2为data选项中的对象类型变量 -->
  <p :style="[baseStyleObj, styleObj1]">内容</p>
  <p :style="[baseStyleObj, styleObj2]">内容</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script> 
<script>
  const vm = new Vue({
    el: '#app',
    data: {
      baseStyleObj: {
        width: '200px',
        backgroundColor: 'red',
      },
      styleObj1: {
        'font-size': '20px'
      },
      styleObj2: {
        'font-size': '30px'
      }
    }
  })
</script>

v-for指令

用于遍历数据来渲染结构,常用的数组与对象均可遍历。

<div id="app">
  <ul>
    <!-- arr为data选项中的数组变量 -->
    <li v-for="item in arr">元素内容为:{{ item }}</li>
    <li v-for="(item, index) in arr">
      元素内容为:{{ item }}, 索引为:{{ index }}
    </li>
    <!-- obj为data选项中的对象 -->
    <li v-for="value in obj">元素内容为:{{ value }}</li>
    <li v-for="(value, key, index) in obj">
      元素内容为: {{ value }}, 键为: {{ key }}, 索引值为: {{ index
    </li>
  </ul>
  
  <ul>
    <li v-for="(item, index) in 5">
      这是第{{ item }}个元素,索引值为:{{ index }}
    </li>
  </ul>
  
  <ul>
    <!-- 使用v-for指令时,应始终指定唯一的key值,可以提高渲染性能并避免问题 -->
    <li v-for="(item, index) in itemList" :key="item.id">
      输入框{{ item.value }}: <input type="text">
    </li>
  </ul>
  
  <!-- 通过<template>标签设置模板占位符,可将部分元素或内容作为整体进行操作 -->
  <template v-for="item in items">
    <span>标签内容</span>
    <span>标签内容</span>
  </template>
</div>

v-show指令

用于控制元素显示与隐藏,适用于显示隐藏频繁切换时使用。

<div id="app">
  <span v-show="true">这段会显示</span>
  <span v-show="false">这段会隐藏</span>
  <!-- isShow为data选项中bool类型变量 -->
  <span v-show="isShow">这段可更改显示隐藏</span>
</div>

注意:<template>标签无法使用v-show指令

v-if指令

用于根据条件控制元素的创建与移除,不适合频繁操作。

<div id="app">
  <span v-if="false">元素不被创建</span>
  <span v-else-if="true">元素被创建</span>
  <span v-else="false">元素不被创建</span>
  <!-- isCreated为data选项中bool类型变量 -->
  <span v-if="isCreated">这段可更改为创建或删除</span>
  
  <!-- 给使用v-if指令时给同类型的元素绑定不同key值,可以避免问题 -->
  <div v-if="type==='username'" :key="'username'">
    用户名登录<input type="text">
  </div>
  <div v-else :key="'email'">
    邮箱登录<input type="text">
  </div>
</div>

注意:出于性能考虑,应避免将v-if和v-for指令用于同一标签。

因为v-for优先级高于v-if,因此当它们同时用于同一标签,vue会先执行v-for批量创建,假如v-if的值是false,然后又会销毁刚创建的内容,这样会浪费性能。

解决方法方法:v-for用于需要批量创建的元素,v-if用于它们的父元素即可。