Day 6 - Vue事件处理

在 Day 5 中我们提到了Vue中的条件渲染,我们用hardcode的方式指派isShow变数的boolean值,但是,假设今天需求改变,我们想透过一个按钮来控制isShow的值,每触发一次button,就将isShow改成false,在按一次再把isShow改回true,这个时候我们要怎麽做呢?

很简单,今天我们将提到 "事件" 的概念。
https://ithelp.ithome.com.tw/upload/images/20210921/20128925m5xbkOi861.png

事件其实就是程序中针对特定行为会触发甚麽特定动作的流程,譬如上面的流程,我们希望使用者按下button後改变isShow的值,按钮称作Event Source,而按钮上会有Event Listener去监听行为有没有被触发,而事件处理者就是触发特定动作後,会交由甚麽动作去执行,例如对应的方法等等。

而"v-on" 其实就是扮演event listener的角色,其作用等於JavaSctipt 中的addEventListener 方法。

那究竟要如何使用v-on呢? 让我们来看看以下程序码。

我们在 button 上以 v-on 呼叫了 changeShowStatus() 这个方法,并在方法内部改变了 isShow 的值。

Vue 中也提供了v-on的语法糖,我们可以用 @click 来取代勒勒长的 v-on:click 就能达到同样的效果。

<template>
  <div id="app">
    <button v-on:click="changeShowStatus"> Click me !</button><br/><br/>
    <span>{{ message }}</span
    ><br />
    <div v-if="isShow">我是 v if true</div>
    <div v-else>我是 v if false</div>
  </div>
</template>

<script>
export default {
  name: "App",
  data() {
    return {
      isShow: true
    };
  },
  methods: {
    changeShowStatus: function () {
      console.log(this.isShow);
      if (this.isShow) {
        this.isShow = false;
      } else {
        console.log("Test");
        this.isShow = true;
      }
    },
  },
};
</script>

以上就是关於v-on的基础用法。

在 JavaScript 里,当监听的事件发生时,EventListener 会去建立一个「事件物件」 (Event Object), 里面包含了所有与这个事件有关的属性,像是各种事件通用的属性与方法、触发事件的元素等等资讯。 像是大家很常用的 preventDefault() 、 stopPropagation() 等都是由 event 物件所提供的方法。

但有时候我们会需要在Vue中,针对event做一些额外的处理,这时候该怎麽办呢?

事实上, v-on 触发事件时,如果没有指定参数,预设就会将 event 物件当作参数传入。

methods: {
    changeShowStatus(event) {
      console.log(event);
      if (this.isShow) {
        this.isShow = false;
      } else {
        this.isShow = true;
      }
    },
  }

若印出console,就可以看到物件内容。
https://ithelp.ithome.com.tw/upload/images/20210921/20128925ainPFzQBNq.png

不过,我们当然也可以主动选择将event变数传入对应方法中。

<button :class="title" v-bind:title="hint" v-on:click="changeShowStatus($event)">

一旦接收到event变数,我们就可以基於我们的需求来客制化我们的程序,来使用event物件中有的方法如 preventDefault()、stopImmediatePropagation()等等。

不过呢~ 即便我们可以透过直接传入event变数来达成我们的需求,但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理DOM 事件细节(将数据处理与页面细节分开),因此 Vue 为了解决这个问题,也提供以修饰符的方式来处理。
可以参考以下连结:
https://cn.vuejs.org/v2/guide/events.html

以上就是今天的内容。


<<:  Day08 | Dart 中的非同步 - Isolate、Event loops

>>:  [Day8] 关於人脸侦测(Face Detection)的二三事

ASP.NET MVC 从入门到放弃(Day13) -C# HttpClient 泛型功能介绍

接着来讲讲泛型的部分.... 简单来说泛型就是传入值、传回值不固定的情况下这时候就可以使用泛型......

Day 13. slate × Interfaces × Positioning

紧接着这一篇要来探讨 slate 是如何实现『定位』这件事的。 在开发以 text 文字资料模型为...

准备Django环境

我们再回到第一天提到的主题内容, 如下图. 我们已经完成training与tracking的部份, ...

Day 26 什麽样的测试应该写,什麽样的不用?

该文章同步发布於:我的部落格 决定要写什麽样的测试 工程师可能会写很多不同种类的测试。在 RSpe...

NIST SDLC和RMF(续)-PartII

-NIST SDLC和RMF 在启动项目後进行系统分类;这意味着已经开发了一个业务案例,并且已选择...