跳至主要內容

常用指令

技术中心大约 3 分钟

常用指令

指令一般是用来操作dom的

双括弧

表达式能够把括号内部的内容以字符串的方式渲染到dom上

注意: {}}中不能放js语法,会把放入其中的内容当字符串来渲染展示,无论是json对象还是数组,都只会当成字符串来展示。

v-on

  • 缩写:@

  • 用法:

    绑定事件监听器。事件类型由参数指定。表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略。

    用在普通元素上时,只能监听原生 DOM 事件。用在自定义元素组件上时,也可以监听子组件触发的自定义事件。

  • 修饰符:

    .stop - 调用 event.stopPropagation()。

    .prevent - 调用 event.preventDefault()。

    .capture - 添加事件侦听器时使用 capture 模式。

    .self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。

    .{keyCode | keyAlias} - 只当事件是从特定键触发时才触发回调。

    .native - 监听组件根元素的原生事件。

    .once - 只触发一次回调。

    .left - (2.2.0) 只当点击鼠标左键时触发。

    .right - (2.2.0) 只当点击鼠标右键时触发。

    .middle - (2.2.0) 只当点击鼠标中键时触发。

    .passive - (2.3.0) 以 { passive: true } 模式添加侦听器

<input v-model="name" v-on:input="inputValueChange"/>
<input v-model="name" @input="inputValueChange"/>
const vm = new Vue({
    el: '#app',
    data() {
        return {
            message: 'hello world',
            name: '张三'
        }
    },
    methods: {
        inputValueChange(e) {
            console.log(e)
            console.log(this.name)
        }
    },
 })

v-if

v-if 系列包括: v-if v-else-if v-else

根据表达式的值的来有条件地渲染元素。

在切换时元素及它的数据绑定 / 组件都将被销毁并重建

div v-if="number === 1">1</div>
<div v-else-if="number === 2">2</div>
<div v-else> 大于2 </div>

const vm = new Vue({
    el: '#app',
    data() {
        return {
            message: 'hello world',
            name: '张三',
            number: 1
        }
    },
    methods: {
        inputValueChange(e) {
            console.log(e)
            console.log(this.name)
        }
    },
 })

v-show

根据表达式之真假值,切换元素的 display CSS property。

<div v-show="number === 1">v-show控制元素是否展示</div>

注意: v-if 与 v-show的区别

  • v-if是 '真正' 的条件渲染,因为在切换时元素及它的数据绑定 、 组件、事件绑定都将被适当的销毁与重建

  • v-show就要简单的多,无论条件成不成立,元素都将被渲染出来,v-show只是进行css的切换,显示还是隐藏

  • 一般来说如果需要频繁的切换显示与不显示就采用v-show,减少元素渲染开销,只渲染一次后续只是控制显示还是隐藏。

  • 如果不涉及频繁切换,可以使用v-if,只有等条件成立的时候才会进行渲染,还可以阻止后续逻辑的产生

v-for

循环,可以循环字符串、对象、数组、数字(最常用的就是数组)

一定要写上一个唯一的,不重复的key, 尽量不要用索引,如果单存只是渲染是可以的

<div v-for="(fruit, index) in fruitArray" :key="fruit">
    {{fruit}}
</div>

const vm = new Vue({
    el: '#app',
    data() {
        return {
            message: 'hello world',
            name: '张三',
            number: 1,
            fruitArray: ['苹果','橘子','香蕉']
        }
    },
    methods: {
        inputValueChange(e) {
            console.log(e)
            console.log(this.name)
        }
    },
 })

v-for扩展:

v-if与v-for不能连用

当和 v-if 一起使用时,v-for 的优先级比 v-if 更高。

所以就会产生性能问题, 性能浪费 
<div v-for="fruit in fruitArray" :key="fruit" v-if="true">
    {{fruit}}
</div>
<div v-for="fruit in fruitArray" :key="fruit" v-if="false">
    {{fruit}}
</div>

// 都会循环3次,并且在循环结束后再判断显示不显示
// 并不是判断不显示就不走v-for, 因为v-for的优先级更高

v-html

v-html: 相当于innerHtml
要注意 xss攻击 (可以获取用户的cookie), 所以要采用可信任的任容
会覆盖子元素

<div v-html="img"></div>
const vm = new Vue({
    el: '#app',
    data() {
        return {
            message: 'hello world',
            name: '张三',
            number: 1,
            fruitArray: ['苹果','橘子','香蕉'],
            img: '<img src="xxx" style="width: 50px; height: 50px;" alt="图片" onerror="alert(1)" />',
        }
    },
    methods: {
        inputValueChange(e) {
            console.log(e)
            console.log(this.name)
        }
    },
 })

v-once

v-once: 只渲染一次,不重新渲染

v-test

v-test: 相当于{