Vue v-on 指令


示例

单击按钮时,使用 v-on 指令更改 <div> 元素的背景颜色。

<template>
  <h1>v-on Example</h1>
  <div v-bind:class="{ yelClass: bgColor }">
    <p>Click the button to change background color of this DIV box.</p>
    <button v-on:click="bgColor = !bgColor">Click</button>
    <p>bgColor property: "{{ bgColor }}"</p>
  </div>
</template>
运行示例 »

请参阅下面的更多示例。


定义和用法

v-on 指令放置在元素上以附加事件侦听器。

要使用 v-on 附加事件侦听器,我们需要提供事件类型、任何修饰符以及该事件发生时应运行的方法或表达式 。

如果 v-on 放置在常规 HTML 标签上,我们可以定义监听的事件类型是常规事件,例如 input, clickmouseover

如果 v-on 放置在自定义组件上,我们可以定义监听的事件类型是从该组件发出的自定义事件。

v-on: 的简写形式是 @


修饰符

修饰符 详细信息
.capture 首先在设置 .capture 修饰符的情况下捕获冒泡事件。 运行示例 »
.once 该事件只能在页面加载后触发一次。 运行示例 »
.passive 通过在 DOM 元素上设置 passive: true 将事件处理程序标记为被动。 这意味着浏览器不必等待查看 event.preventDefault() 是否被调用,并且对于经常发生的事件(例如滚动),将事件处理程序设置为被动可以提高性能。 运行示例 »
.prevent 该事件被阻止触发。 例如,可用于阻止默认表单提交事件。 不可能阻止所有事件。 运行示例 »
.stop 冒泡事件停止进一步传播。 调用 event.stopPropagation() 运行示例 »
.self 默认情况下,事件向上传播到父元素,因此一个事件可以触发多个事件侦听器。 .self 修饰符仅允许来自其自身元素的事件触发事件侦听器。 运行示例 »
.{keyAlias} 限制事件处理程序仅对某些事件键做出反应,例如 v-on:click.rightv-on:keyup.s。 我们甚至可以要求多个按键需要同时发生才能让处理程序做出反应,如下所示:v-on:click.left.shift 运行示例 »
.left 单击鼠标左键。
.right 单击鼠标右键。
.middle 单击鼠标中键。

更多示例

示例 1

首先使用.capture修饰符捕获父元素中的点击事件。

<template>
  <h1>v-on Example</h1>
  <p>当在父 DIV 元素上使用".capture"修饰符时,当单击子元素时,将首先在父元素中捕获事件。</p>
  <p>如果从此代码中删除".capture"修饰符,则子元素将首先捕获单击事件。 这是默认行为,事件首先在子元素中冒泡,然后到父元素。</p>
  <div v-on:click.capture="this.msg.push('parent')" id="parent">
    <p>This is the parent element.</p>
    <div v-on:click="this.msg.push('child')">
      <p>This is the child element. CLICK HERE!</p>
    </div>
  </div>
  <p>捕获事件的时间和地点的顺序。</p>
  <ol>
    <li v-for="x in msg">{{ x }}</li>
  </ol>
</template>

<script>
export default {
  data() {
    return {
      msg: []
    };
  }
}
</script>

<style scoped>
div {
  margin: 10px;
  padding: 10px;
  border: dashed black 1px;
}
#parent {
  width: 250px;
  background-color: lightpink;
}
#parent > div {
  cursor: pointer;
  background-color: lightgreen;
}
</style>
运行示例 »

示例 2

使用 .stop 修饰符阻止事件进一步传播。

<template>
  <h1>v-on Example</h1>
  <p>".stop"修饰符可阻止单击事件进一步传播。</p>
  <p>如果从此代码中删除".stop"修饰符,父元素还将捕获子元素上的单击事件。</p>
  <div v-on:click="this.msg.push('parent')" id="parent">
    <p>This is the parent element.</p>
    <div v-on:click.stop="this.msg.push('child')">
      <p>这是子元素。 点击这里!</p>
    </div>
  </div>
  <p>捕获事件的时间和地点的顺序。</p>
  <ol>
    <li v-for="x in msg">{{ x }}</li>
  </ol>
</template>

<script>
export default {
  data() {
    return {
      msg: []
    };
  }
}
</script>

<style scoped>
div {
  margin: 10px;
  padding: 10px;
  border: dashed black 1px;
}
#parent {
  width: 250px;
  background-color: lightpink;
}
#parent > div {
  cursor: pointer;
  background-color: lightgreen;
}
</style>
运行示例 »

示例 3

使用.passive修饰符来增强滚动过程中的性能。

<template>
  <h1>v-on Example</h1>
  <p>'.passive' 修饰符将事件处理程序设置为被动,这可以提高性能。</p>
  <div v-on:scroll.passive="this.scrollTimes++" id="parent">
    <p>Scroll here.</p>
    <p>Bladi-bladi-bladi</p>
    <p>potato potato</p>
    <p>Scroll-scroll-scroll</p>
    <p>Scroll more...</p>
  </div>
  <p>Scroll happended {{ scrollTimes }} times.</p>
</template>

<script>
export default {
  data() {
    return {
      scrollTimes: 0
    };
  }
}
</script>

<style scoped>
div {
  margin: 10px;
  padding: 10px;
  border: dashed black 1px;
  width: 200px;
  height: 50px;
  overflow: scroll;
  background-color: lightcoral;
}
</style>
运行示例 »

示例 4

使用 .once 修饰符来增强滚动期间的性能。

<template>
  <h1>v-on Example</h1>
  <p>".once"修饰符可防止事件发生多次。</p>
  <button v-on:click.once="clickTimes++">Click</button>
  <p>Click event happened {{ clickTimes }} times.</p>
</template>

<script>
export default {
  data() {
    return {
      clickTimes: 0
    };
  }
}
</script>
运行示例 »

示例 5

使用 .self 修饰符,以便父元素仅对自身发生的点击事件做出反应。

<template>
  <h1>v-on Example</h1>
  <p>'.self' 修饰符设置在父元素上。</p>
  <p>单击子元素并查看事件如何传播经过父元素,因为父单击事件仅对元素本身的单击做出反应。</p>
  <div v-on:click="addMsg('grandParent')" id="grandParent">
    Grandparent element
    <div v-on:click.self="addMsg('parent')">
      Parent element.
      <div v-on:click="addMsg('child')">
        Child element. CLICK HERE!
      </div>
    </div>
  </div>
  <p>捕获事件的时间和地点的顺序。</p>
  <ol>
    <li v-for="x in msg">{{ x }}</li>
  </ol>
</template>

<script>
export default {
  data() {
    return {
      msg: []
    };
  },
  methods: {
    addMsg(txt) {
      this.msg.push(txt);
    }
  }
}
</script>

<style scoped>
div {
  margin: 10px;
  padding: 10px;
  border: dashed black 1px;
  cursor: pointer;
}
#grandParent {
  width: 250px;
  background-color: lightpink;
}
#grandParent > div {
  background-color: lightgreen;
}
#grandParent > div > div {
  background-color: lightskyblue;
}
</style>
运行示例 »

示例 6

使用 .prevent 修饰符防止单击鼠标右键时出现默认下拉列表。

<template>
  <h1>v-on Example</h1>
  <p>".prevent"修饰符设置为防止用户单击鼠标右键时出现下拉菜单。</p>
  <div 
    v-on:click.right.prevent="changeColor" 
    v-bind:style="{ backgroundColor: 'hsl(' + bgColor + ',80%,80%)' }">
    <p>Press right mouse button here.</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      bgColor: 0
    }
  },
  methods: {
    changeColor() {
      this.bgColor += 50
    }
  }
}
</script>

<style scoped>
div {
  margin: 10px;
  padding: 10px;
  border: dashed black 1px;
  width: 200px;
}
</style>
运行示例 »

示例 7

当用户在按住 Shift 键的同时单击鼠标左键时,使用 .left.shift 修饰符更改图像。

<template>
  <h1>v-on Example</h1>
  <p>Hold 'Shift' key and press left mouse button on the image:</p>
  <img v-on:click.left.shift="changeImg" v-bind:src="imgUrl">
</template>

<script>
export default {
  data() {
    return {
      imgFish: true,
      imgUrl: 'img_fish.svg'
    }
  },
  methods: {
    changeImg() {
      this.imgFish = !this.imgFish;
      if (this.imgFish) {
        this.imgUrl = 'img_fish.svg'
      }
      else {
        this.imgUrl = 'img_tiger.svg'
      }
    }
  }
}
</script>

<style scoped>
img {
  width: 200px;
}
</style>
运行示例 »

相关页面

Vue 教程:Vue 事件

Vue 教程:Vue v-on 指令

Vue 教程:Vue 方法

Vue 教程:Vue 事件修饰符

JavaScript 教程:JavaScript 事件