内容渲染指令

v-text

v-text 通过设置元素的textContent属性来工作,因此它将覆盖元素中所有的内容。如果仅仅需要更新textContent的部分,应该使用模板语法的文本插值方式,即{{ }}形式。

示例:

<span v-text="msg"></span>
<!-- 等同于 -->
<span>{{msg}}</span>

v-html

v-html用于更新元素的innerHTML,会将内容直接作为普通HTML插入。在站点上动态渲染任意的HTML是非常危险的,因为它非常容易受到XSS攻击,所以只能对信任的内容使用HTML插值,不能将用户提供的内容作为插值。

<p>Using text interpolation: {{ rawHtml }}</p>
<p>Using v-html directive: <span v-html="rawHtml"></span></p>

v-on

v-on可以给元素绑定事件监听器。v-on可以缩写为@。可以绑定的值类型为:Function | Inline Statement | Object(不带参数),参数为event(如果使用对象语法的话,那么为可选项)。

<!-- 绑定函数 -->
<button v-on:click="doThis">Click</button>

<!-- 绑定内联声明 -->
<button v-on:click="doThat('hello', $event)">Click</button>

<!-- 对象语法 -->
<button v-on="{mousedown: doThis, mouseup: doThat}">Event</button>

<!-- 使用@缩写-->
<button @click="doThis">Click</button>

绑定的事件可以是动态的,例如可以使用@[event]="doThis"event是事件名的变量。

当用于普通元素,只监听原生DOM事件。当用于自定义元素组件,这监听子组件触发的自定义事件。

当监听原生DOM事件时,方法接收原生事件作为唯一参数。如果使用内联声明,声明可以访问一个特殊的$event变量,v-on:click="handle('ok', $event)"

事件修饰符

在处理事件的时候调用event.preventDefault()或者event.stopPropagation()是很常见的。尽管我们可以直接在方法内部调用,但是如果方法能够更加专注于数据逻辑而不用去处理DOM事件的细节会更好。

为了解决这个问题,Vue为v-on提供了事件修饰符。修饰符是用.表示的指令后缀,包含以下这些:

  • .stop
  • .prevent
  • .self
  • .capture
  • .once
  • .passive
<!-- 单击事件将停止传递 -->
<a @click.stop="doThis">do this</a>

<!-- 提交事件将不再重新加载页面 -->
<form @submit.prevent="onSubmit"></form>

<!-- 仅当 event.target 是元素本身时才会触发事件处理器 -->
<div @click.self="doThat">...</div>

<!-- 点击事件最多触发一次 -->
<a @click.once="doThis">...</a>

<!-- 添加事件监听器时,使用 `capture` 捕获模式 -->
<!-- 例如:指向内部元素的事件,在被内部元素处理前,先被外部处理 -->
<div @click.capture="doThis">...</div>

<!-- 滚动事件的默认行为 (scrolling) 将立即发生而非等待 `onScroll` 完成 -->
<!-- 以防其中包含 `event.preventDefault()` -->
<div @scroll.passive="onScroll">...</div>

.passive修饰符一般用于触摸事件的监听器,可以用来改善移动端设备的滚屏性能。请勿同时使用 .passive.prevent,因为.passive已经向浏览器表明了你不想阻止事件的默认行为。如果这么做了,则.prevent会被忽略,并且浏览器会抛出警告。

其他的用法:

<!-- 修饰符可以使用链式调用 -->
<a @click.stop.prevent="doThat">...</a>

<!-- 也可以只有修饰符 -->
<form @submit.prevent></form>

使用修饰符时需要注意调用顺序,因为相关代码是以相同的顺序生成的。因此使用@click.prevent.self会阻止元素及其子元素的所有点击事件的默认行为,而@click.self.prevent则只会阻止对元素本身的点击事件的默认行为。

按键修饰符

在监听键盘事件时,我们经常需要检查特定的按键。Vue允许在监听按键事件时添加按键修饰符。

<!-- 仅在`key`为`Enter`时调用`submit`-->
<input @keyup.enter="submit" />

如果按键名是两个单词的,需要转为kebab-case的形式。如:

<!-- 仅会在$event.key为'PageDown'时调用事件处理 -->
<input @keyup.page-down="onPageDown"/>

Vue给一些常用的按键提供了别名:

  • .enter
  • .tab
  • .delete 会捕获Delete和Backspace两个按键
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right

系统按键修饰符

键盘上有一些特殊的系统按键供按下快捷键的时候使用,如复制为ctrl+c,在Mac上为cmd+c,如下:

  • .ctrl
  • .alt
  • .shift
  • .meta

在Mac上,meta为Command键,在Windows上,meta为Win键。

<!-- Alt + Enter -->
<input @keyup.alt.enter="clear"/>

<!-- Ctrl + 点击 -->
<div @click.ctrl="doSomething">Do something</div>

注意点:系统按键修饰符和常规按键不同,与keyup事件一起使用时,该按键必须在事件发出时候处于按下的状态。换句话说,keyup.ctrl只会在你仍然按住ctrl但松开了另一个键时被触发。若单独松开ctrl键将不会触发。

.exact修饰符

.exact修饰符允许精确控制触发事件所需的系统修饰符的组合。

<!-- 当按下Ctrl的时候,即使按下Alt或Shift也会触发 -->
<button @click.ctrl="onClick">A</button>

<!-- 仅当按下 Ctrl 且未按任何其他键时才会触发 -->
<button @click.ctrl.exact="onCtrlClick">A</button>

<!-- 仅当没有按下任何系统按键时触发 -->
<button @click.exact="onClick">A</button>

鼠标按键修饰符

  • .left
  • .right
  • .middle

这些修饰符处理由鼠标按键触发的事件。

注意点,这里的.left.right.middle仅仅是名字叫这个,实际上指代的是“主”、“次”和“辅助”,而非具体的物理按键。因此,对于左手用鼠标布局而言,“主”按键在物理上可能是右边的按键,但却会触发.left修饰符对应的处理程序。又或者触控板可能通过单指点击触发.left处理程序,通过双指点击触发.right处理程序,通过三指点击触发.middle处理程序。同样,产生“鼠标”事件的其他设备和事件源,也可能具有与“左”,“右”完全无关的触发模式。