Vue指令大全(不定时更新)

跟随时代的浪潮,把vue这个渐进式JavaScript框架,熟悉使用起来吧

1.插值表达式

目的: 在dom标签中, 直接插入内容

又叫: 声明式渲染/文本插值

语法: {{ 表达式 }}

<template>
  <div>
    <h1>{{ msg }}</h1>
    <h2>{{ obj.name }}</h2>
    <h3>{{ obj.age > 18 ? '成年' : '未成年' }}</h3>
  </div>
</template>
 
<script>
export default {
  data() {              // 格式固定, 定义vue数据之处
    return {            // key相当于变量名
      msg: "hello, vue",
      obj: {
        name: "小vue",
        age: 5
      }
    }
  }
}
</script>
 
<style>
</style>

2.vue指令-v-bind

目标: 给标签属性设置vue变量的值

vue指令, 实质上就是特殊的 html 标签属性, 特点: v- 开头

每个指令, 都有独立的作用

语法:v-bind:属性名="vue变量"

简写::属性名="vue变量"

<!-- vue指令-v-bind属性动态赋值 -->
<a v-bind:href="url">我是a标签</a>
<img :src="imgSrc">

3.vue指令-v-on

目标: 给标签绑定事件

语法

v-on:事件名="要执行的==少量代码=="

v-on:事件名="methods中的函数"

v-on:事件名="methods中的函数(实参)"

简写: @事件名="methods中的函数"

<!-- vue指令:   v-on事件绑定-->
<p>你要买商品的数量: {{count}}</p>
<button v-on:click="count = count + 1">增加1</button>
<button v-on:click="addFn">增加1个</button>
<button v-on:click="addCountFn(5)">一次加5件</button>
 
<button @click="subFn">减少</button>
 
<script>
    export default {
        // ...其他省略
        methods: {
            addFn(){ // this代表export default后面的组件对象
                     //(下属有data里return出来的属性)
                this.count++
            },
            addCountFn(num){
                this.count += num
            },
            subFn(){
                this.count--
            }
        }
    }
</script>

3.1vue指令-v-on事件对象

目标: vue事件处理函数中, 拿到事件对象

语法:

无传参, 通过形参直接接收

传参, 通过$event指代事件对象传给事件处理函数

<template>
  <div>
    <a @click="one" href="http://www.baidu.com">阻止百度</a>
    <hr>
    <a @click="two(10, $event)" href="http://www.baidu.com">阻止去百度</a>
  </div>
</template>
 
<script>
export default {
  methods: {
    one(e){
      e.preventDefault()
    },
    two(num, e){
      e.preventDefault()
    }
  }
}
</script>

3.2vue指令-v-on修饰符

目的: 在事件后面.修饰符名 - 给事件带来更强大的功能

语法:

@事件名.修饰符="methods里函数"

.stop - 阻止事件冒泡

.prevent - 阻止默认行为

.once - 程序运行期间, 只触发一次事件处理函

.capture 添加事件侦听器时使用事件捕获模式

.self 只当事件在该元素本身(比如不是子元素)触发时触发回调

<template>
  <div @click="fatherFn">
    <!-- vue对事件进行了修饰符设置, 在事件后面.修饰符名即可使用更多的功能 -->
    <button @click.stop="btn">.stop阻止事件冒泡</button>
    <a href="http://www.baidu.com" @click.prevent="btn">.prevent阻止默认行为</a>
    <button @click.once="btn">.once程序运行期间, 只触发一次事件处理函数</button>
  </div>
</template>
 
<script>
export default {
  methods: {
    fatherFn(){
      console.log("father被触发");
    },
    btn(){
      console.log(1);
    }
  }
}
</script>

3.3vue指令-v-on按键修饰符

目标: 给键盘事件, 添加修饰符, 增强能力

语法:

@keyup.enter - 监测回车按键

@keyup.esc - 监测返回按键

更多修饰符

<template>
  <div>
    <input type="text" @keydown.enter="enterFn">
    <hr>
    <input type="text" @keydown.esc="escFn">
  </div>
</template>
 
<script>
export default {
 methods: {
   enterFn(){
     console.log("enter回车按键了");
   },
   escFn(){
     console.log("esc按键了");
   }
 }
}
</script>

4.vue指令 v-model

目标: 把value属性和vue数据变量, 双向绑定到一起

语法: v-model="vue数据变量"

双向数据绑定

数据变化 -> 视图自动同步

视图变化 -> 数据自动同步

<template>
  <div>
    <!-- 
    	v-model:是实现vuejs变量和表单标签value属性, 双向绑定的指令
    -->
    <div>
      <span>用户名:</span>
      <input type="text" v-model="username" />
    </div>
    <div>
      <span>密码:</span>
      <input type="password" v-model="pass" />
    </div>
    <div>
      <span>来自于: </span>
      <!-- 下拉菜单要绑定在select上 -->
      <select v-model="from">
        <option value="北京市">北京</option>
        <option value="南京市">南京</option>
        <option value="天津市">天津</option>
      </select>
    </div>
    <div>
      <!-- (重要)
      遇到复选框, v-model的变量值
      非数组 - 关联的是复选框的checked属性
      数组   - 关联的是复选框的value属性
       -->
      <span>爱好: </span>
      <input type="checkbox" v-model="hobby" value="抽烟">抽烟
      <input type="checkbox" v-model="hobby" value="喝酒">喝酒
      <input type="checkbox" v-model="hobby" value="写代码">写代码
    </div>
    <div>
      <span>性别: </span>
      <input type="radio" value="男" name="sex" v-model="gender">男
      <input type="radio" value="女" name="sex" v-model="gender">女
    </div>
    <div>
      <span>自我介绍</span>
      <textarea v-model="intro"></textarea>
    </div>
  </div>
</template>
 
<script>
export default {
  data() {
    return {
      username: "",
      pass: "",
      from: "",
      hobby: [], 
      sex: "",
      intro: "",
    };
    // 总结:
    // 特别注意: v-model, 在input[checkbox]的多选框状态
    // 变量为非数组, 则绑定的是checked的属性(true/false) - 常用于: 单个绑定使用
    // 变量为数组, 则绑定的是他们的value属性里的值 - 常用于: 收集勾选了哪些值
  }
};
</script>

4.1vue指令 v-model修饰符

目标: 让v-model拥有更强大的功能

语法:

v-model.修饰符="vue数据变量"

.number 以parseFloat转成数字类型

.trim 去除首尾空白字符

.lazy 在change时触发而非inupt时

<template>
  <div>
    <div>
      <span>年龄:</span>
      <input type="text" v-model.number="age">
    </div>
    <div>
      <span>人生格言:</span>
      <input type="text" v-model.trim="motto">
    </div>
    <div>
      <span>自我介绍:</span>
      <textarea v-model.lazy="intro"></textarea>
    </div>
  </div>
</template>
 
<script>
export default {
  data() {
    return {
      age: "",
      motto: "",
      intro: ""
    }
  }
}
</script>

5.vue指令 v-text和v-html

目的: 更新DOM对象的innerText/innerHTML

语法:

v-text="vue数据变量"

v-html="vue数据变量"

注意: 会覆盖插值表达式

<template>
  <div>
    <p v-text="str"></p>
    <p v-html="str"></p>
  </div>
</template>
 
<script>
export default {
  data() {
    return {
      str: "<span>我是一个span标签</span>"
    }
  }
}
</script>

6.vue指令 v-show和v-if

目标: 控制标签的隐藏或出现

语法:

v-show="vue变量"

v-if="vue变量"

原理

v-show 用的display:none隐藏 (频繁切换使用)

v-if 直接从DOM树上移除

高级

v-else使用

<template>
  <div>
    <!--原理: display:none -->
    <h1 v-show="isok">v-show的盒子</h1>
    <h2 v-if="istrue">v-if的盒子</h2>
    <!-- v-if   v-else  v-else-if -->
    <p v-if="age < 18">未成年</p>
    <p v-else-if="age > 18 && age < 60">成年</p>
    <p v-else>老年</p>
  </div>
</template>
 
<script>
export default {
  data() {
    return {
      isok: false,
      istrue: true,
      age: 15,
    };
  },
};
</script>
 
<style>
</style>

 7.vue指令-v-for

作用:基于源数据多次渲染元素或模板块

语法

v-for="(值, 索引) in 目标结构"

v-for="值 in 目标结构"

目标结构:

可以遍历数组 / 对象 / 数字 / 字符串 (可遍历结构)

注意:

v-for的临时变量名不能用到v-for范围外

<template>
  <div >
    <div >
      <!-- v-for 把一组数据, 渲染成一组DOM -->
      <!-- 口诀: 让谁循环生成, v-for就写谁身上 -->
      <p>学生姓名</p>
      <ul>
        <li v-for="(item, index) in arr" :key="item">
          {{ index }} - {{ item }}
        </li>
      </ul>
 
      <p>学生详细信息</p>
      <ul>
        <li v-for="obj in stuArr" :key="obj.id">
          <span>{{ obj.name }}</span>
          <span>{{ obj.sex }}</span>
          <span>{{ obj.hobby }}</span>
        </li>
      </ul>
 
      <!-- v-for遍历对象(了解) -->
      <p>老师信息</p>
      <div v-for="(value, key) in tObj" :key="value">
        {{ key }} -- {{ value }}
      </div>
 
      <!-- v-for遍历整数(了解) - 从1开始 -->
      <p>序号</p>
      <div v-for="i in count" :key="i">{{ i }}</div>
    </div>
  </div>
</template>
 
<script>
export default {
  data() {
    return {
      arr: ["小明", "小欢欢", "大黄"],
      stuArr: [
        {
          id: 1001,
          name: "孙悟空",
          sex: "男",
          hobby: "吃桃子",
        },
        {
          id: 1002,
          name: "猪八戒",
          sex: "男",
          hobby: "背媳妇",
        },
      ],
      tObj: {
        name: "小黑",
        age: 18,
        class: "1期",
      },
      count: 10,
    };
  },
};
</script>

  7.1v-for更新监测

目标: 当v-for遍历的目标结构改变, Vue触发v-for的更新

例子:

情况1: 数组翻转 情况2: 数组截取 情况3: 更新值

口诀:

数组变更方法, 就会导致v-for更新, 页面更新 数组非变更方法, 返回新数组, 就不会导致v-for更新, 可采用覆盖数组或this.$set()
<template>
  <div>
    <ul>
      <li v-for="(val, index) in arr" :key="index">
        {{ val }}
      </li>
    </ul>
    <button @click="revBtn">数组翻转</button>
    <button @click="sliceBtn">截取前3个</button>
    <button @click="updateBtn">更新第一个元素值</button>
  </div>
</template>
 
<script>
export default {
  data(){
    return {
      arr: [5, 3, 9, 2, 1]
    }
  },
  methods: {
    revBtn(){
      // 1. 数组翻转可以让v-for更新
      this.arr.reverse()
    },
    sliceBtn(){
      // 2. 数组slice方法不会造成v-for更新
      // slice不会改变原始数组
      // this.arr.slice(0, 3)
 
      // 解决v-for更新 - 覆盖原始数组
      let newArr = this.arr.slice(0, 3)
      this.arr = newArr
    },
    updateBtn(){
      // 3. 更新某个值的时候, v-for是监测不到的
      // this.arr[0] = 1000;
 
      // 解决-this.$set()
      // 参数1: 更新目标结构
      // 参数2: 更新位置
      // 参数3: 更新值
      this.$set(this.arr, 0, 1000)
    }
  }
}
</script>
 
<style>
 
</style>

这些方法会触发数组改变, v-for会监测到并更新页面

push()

pop()

shift()

unshift()

splice()

sort()

reverse()

7.2 v-for中 key值

key属性 (key的值只能是唯一不重复的, 字符串或数值 ),id用id, 无id用索引

推荐:使用 v-for 的时候提供 key 属性,以获得性能提升。

说明:使用 key,VUE会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素

8.动态class

   8.1用v-bind给标签class设置动态的值

把类名保存在vue变量中赋予给标签 

语法:

:

<template>
  <div>
    <!-- 语法:
      :
      使用场景: vue变量控制标签是否应该有类名
     -->
    <p :>动态class</p>
  </div>
</template>

<script>
export default {
  data(){
    return {
      bool: true
    }
  }
}
</script>

<style scoped>
  .red_str{
    color: red;
  }
</style>

8.2 动态style

给标签动态设置style的值(行内式)

语法

:

<template>
  <div>
    <!-- 动态style语法
      :
     -->
    <p :>动态style</p>
  </div>
</template>

<script>
export default {
  data(){
    return {
      colorStr: 'red'
    }
  }
}
</script>

<style>

</style>

9.vue过滤器

目的:转换格式, 过滤器就是一个函数, 传入值返回处理后的值

过滤器只能用在, 插值表达式和v-bind表达式

语法:

Vue.filter("过滤器名", (值) => {return "返回处理后的值"})

filters: {过滤器名字: (值) => {return "返回处理后的值"}

例子:

全局定义字母都大写的过滤器

局部定义字符串翻转的过滤器

//main.js文件中 定义全局过滤器

// 全局过滤器 Vue.filter(过滤器的名字,callback)
Vue.filter('reverse', val => val.split("").reverse().join(""))
// 全局过滤器 传参 
Vue.filter('reverse1', (val, str) => val.split("").reverse().join(str))
<template>
  <div>
    <p>原来的 样子:{{ msg }}</p>
    <!-- 全局过滤器 -->
    <p>翻转后的样子:{{ msg | reverse }}</p>
    <p :title="msg | reverse">鼠标悬停 提示文字</p>
    <!-- 局部过滤器 -->
    <p>大写的样子{{ msg | toUp }}</p>
    <p>翻转后的样子:{{ msg | reverse1("&") }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      msg: "hello",
    };
  },
  // 局部过滤器
  filters: {
    toUp(val) {
      return val.toUpperCase();
    },
  },
};
</script>
<style>
</style>

9.1vue过滤器-传参和多过滤

语法:

过滤器传参: vue变量 | 过滤器(实参)

多个过滤器: vue变量 | 过滤器1 | 过滤器2

<p :title="msg | toUp | reverse('|')">鼠标长停</p>

10.vue计算属性-computed

作用:一个数据, 依赖另外一些数据计算而来的结果

语法:

computed: {
    "计算属性名" () {
        return "值"
    }
}

<template>
  <div>
    <p>{{ num }}</p>
  </div>
</template>

<script>
export default {
  data(){
    return {
      a: 10,
      b: 20
    }
  },
  // 计算属性:
 // 注意1: 计算属性和data属性都是变量-不能重名
 // 注意2: 函数内变量变化, 会自动重新计算结果返回
  computed: {
    num(){
      return this.a + this.b
    }
  }
}
</script>
<style>
</style>

10.1vue计算属性-完整写法

 使用场景:计算属性也是变量, 如果想要直接赋值, 需要使用完整写法

语法:

computed: {
    "属性名": {
        set(值){
            
        },
        get() {
            return "值"
        }
    }
}

<template>
  <div>
      <div>
          <span>姓名:</span>
          <input type="text" v-model="full">
      </div>
  </div>
</template>

<script>
// 问题: 给计算属性赋值 - 需要setter
// 解决:
export default {
    computed: {
        full: {
            // 给full赋值触发set方法
            set(val){
                console.log(val)
            },
            // 使用full的值触发get方法
            get(){
                return "无名氏"
            }
        }
    }
}
</script>

<style>

</style>

11.vue侦听器-watch

  作用:可以侦听data/computed属性值改变

语法:

watch: {
    "被侦听的属性名" (newVal, oldVal){
        
    }
}

<template>
  <div>
    <input type="text" v-model="name">
  </div>
</template>

<script>
export default {
  data(){
    return {
      name: ""
    }
  },
  // 目标: 侦听到name值的改变

  watch: {
    // newVal: 当前最新值
    // oldVal: 上一刻值
    name(newVal, oldVal){
      console.log(newVal, oldVal);
    }
  }
}
</script>

<style>

</style>

11.1vue侦听器-深度侦听和立即执行

作用:侦听复杂类型, 或者立即执行侦听函数

语法:

watch: {
    "要侦听的属性名": { //变量名对应值改变这里自动触发
        immediate: true, // 立即执行(网页打开handler执行一次)
        deep: true, // 深度侦听复杂类型内变化
        handler (newVal, oldVal) { 
            
        }
    }
}

<template>
  <div>
    <input type="text" v-model="user.name">
    <input type="text" v-model="user.age">
  </div>
</template>

<script>
export default {
  data(){
    return {
      user: {
        name: "",
        age: 0
      }
    }
  },
  // 目标: 侦听对象user
  watch: {
    user: {
      deep: true,
      immediate: true
      handler(newVal, oldVal){
        // user里的对象
        console.log(newVal, oldVal);
      },
      
    }
  }
}
</script>

<style>

</style>

来源url
栏目