学习下vue的指令(2)

128 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

前言

上一篇文章讲了vue自带的指令,包括以下这些

  • v-model
  • v-html
  • v-text
  • v-if/v-else-if/v-else
  • v-for

今天把剩下的指令一起总结了。

指令

v-on

绑定事件的指令。后面跟着绑定的事件名。

如果绑定在原生dom上,只能绑定原生事件(比如click,input,mouseenter等等)。

如果绑定在上组件,可以绑定原生事件(需要加 .natvie 修饰符,绑定在组件的根元素上)

还可以绑定自定义事件,子组件可以通过$emit触发。

例子:

// 原生dom
<input v-on:input="inputFn" />

inputFn () {
 console.log('我是input事件')
}

// father.vue  组件
<my-component v-on:customEevent="customEevent" />

// my-component.vue
// 通过$emit触发,后面可以跟着参数,传给父组件
this.$emit('customEvent', 'args1', 'args2',....)

v-on可以简写,简写是@。还可以跟着修饰符,比如上面的.native修饰符。

还有以下修饰符

  • .stop(阻止冒泡)
  • .prevent(阻止默认事件),
  • .self(自身触发)
  • .once(只触发一次)
  • 键值或者键的别名(比如:.13(.enter)代表enter键)
// 简写
<input @input="inputFn" />

// 阻止事件冒泡
<button @click.stop="inputFn" />

// 监听enter键,也可以写成@keydown.13
<button @keydown.enter="inputFn" />

// 原生click事件
<my-component @click.native="clickFn" />

v-bind

传递属性的指令。可以在原生dom或者组件上使用。

如果用在原生dom上,可以传原生属性,比如class/style等。可以跟对象或者数组。

如果用在原生props上,除了传原生属性,还可以传自定义属性,自定义属性需要在子组件里通过props定义。

// 最终渲染的div,class只有a
<div v-bind:class="{a: true, b: false}"></div>
<div v-bind:class="['a']"></div>

// 最终渲染的div,color是red
<div v-bind:style="{color: 'red', fontSize: '18px'}"></div>
<div v-bind:style="[{color: 'red', fontSize: '18px'}]"></div>

v-bind也可以简写,简写是:。 v-bind也可以不跟参数,然后通过对象传值。但是此时不能简写。

// 简写
<div :class="['a']"></div>

// 不跟参数, 最终渲染的div id和class都是a
<div v-bind="{id: 'a', class: 'a'}"></div>

// fahter.vue
<my-component :a="a" />

//my-component.vue
{
  props: {
    a: {}
  }
}

v-slot

这个作用在的插槽的指令。

后面可以跟着参数,跟着参数就是具名插槽。不跟就是默认插槽(default),可以简写#

也可以接受子组件传的prop数据。

    // 具名插槽  等同于#name
    <HelloWorld>
      <template v-slot:name>答案cp3</template>
    </HelloWorld>
    
    //  HelloWorld.vue
    <div>
     <slot name="name"></slot>
    </div>

渲染成<div>答案cp3</div>

    // 具名插槽 + 传参
    <HelloWorld>
      <template v-slot:name="obj">{{obj.myName}}</template>
    </HelloWorld>
    
    //  HelloWorld.vue
    <div>
     <slot name="name" myName="答案cp3"></slot>
    </div>

渲染成<div>答案cp3</div>

v-pre

不需要解析任何内容,直接原样显示。

    <div v-pre>
     {{name}}
    </div>

渲染成<div>{{name}}</div>

v-once

只渲染一次的指令。后面数据如果重新更新,不会再更新。

    <div v-once>{{name}}</div>
    <button @click="name ='a'">设置</button>
    
    name: '答案cp3'

name只会渲染一次,是答案cp3,按钮点击不会改变成a

v-cloak

这个指令会保存在绑定的元素上,直到实例编译完成。

    <div v-cloak>
     {{name}}
    </div>