Vue事件在组件中的简单使用以及子组件事件触发父组件自定义事件

在Vue中,通过v-on 来监听DOM事件,可以通过@简写代替。

一个简单的在组件中的事件调用示例

  • 在template的Html中使用v-on或@监听一个click事件,并指定事件执行handleClick方法。
  • handleClick需要在组件的methods集合中定义。
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
        <todo-list></todo-list>
    </div>

    <script>
      Vue.component("todo-list", {
        template: `
                <ul>
                    <todo-item  v-for="item in list" data-wen="wen" :title="item.title" :del="item.del"></todo-item>
                </ul>
            `,
        data: function() {
          return {
            list: [
              {
                title: "新课程1",
                del: false
              },
              {
                title: "新课程2",
                del: true
              },
              {
                title: "新课程3",
                del: false
              }
            ]
          };
        },
        methods:{
        }
      });
      Vue.component("todo-item", {
        props: {
          title: String,
          del: {
            type: Boolean,
            default: false
          }
        },
        template: `
              <li>
                  <span v-if="!del">{{title}}</span>
                  <span v-else style="text-decoration:line-through">{{title}}</span>
                  <button v-show="!del" @click="handleClick">删除</button>
              </li>`,
        data: function() {
          return {};
        },
        methods: {
            handleClick(){
                console.log("点击删除按钮!");
            }
        }
      });
      var vm = new Vue({
        el: "#app",
        data: {
        }
      });
    </script>
  </body>
</html>

效果如下
image

组件的事件调用如何触发上级节点的事件?通过$emit来触发。

this.$emit('自定义事件名',参数);//参数如有多个,可以用逗号隔开继续增加,如this.$emit('自定义事件名',参数1,参数2)

示例:组件todo-item上的事件,继续触发父组件todo-list上的自定义事件。

  • 在事件方法handleClick中通过$emit继续触发父组件自定义事件。并传入参数title
this.$emit('delete',this.title);
  • 在父组件todo-list的template中的html中监听自定义事件@delete="handleDelete"或v-on:delete="handleDelete"
  • 在父组件件todo-list的methods定义handleDelete方法(带参数)
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
        <todo-list></todo-list>
    </div>

    <script>
      Vue.component("todo-list", {
        template: `
                <ul>
                    <todo-item @delete="handleDelete" v-for="item in list" data-wen="wen" :title="item.title" :del="item.del"></todo-item>
                </ul>
            `,
        data: function() {
          return {
            list: [
              {
                title: "新课程1",
                del: false
              },
              {
                title: "新课程2",
                del: true
              },
              {
                title: "新课程3",
                del: false
              }
            ]
          };
        },
        methods:{
            handleDelete(vtitle){
                console.log("删除工程!",vtitle)
            }
        }
      });
      Vue.component("todo-item", {
        props: {
          title: String,
          del: {
            type: Boolean,
            default: false
          }
        },
        template: `
              <li>
                  <span v-if="!del">{{title}}</span>
                  <span v-else style="text-decoration:line-through">{{title}}</span>
                  <button v-show="!del" @click="handleClick">删除</button>
              </li>`,
        data: function() {
          return {};
        },
        methods: {
            handleClick(){
                console.log("点击删除按钮!");
                this.$emit('delete',this.title);
            }
        }
      });
      var vm = new Vue({
        el: "#app",
        data: {
        }
      });
    </script>
  </body>
</html>

Vue事件还提供了大量的事件修饰符

  • .stop
  • .prevent
  • ....
<!-- 阻止单击事件继续传播 -->
<a v-on:click.stop="doThis"></a>

<!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form>

<!-- 修饰符可以串联 -->
<a v-on:click.stop.prevent="doThat"></a>

<!-- 只有修饰符 -->
<form v-on:submit.prevent></form>

<!-- 添加事件监听器时使用事件捕获模式 -->
<!-- 即内部元素触发的事件先在此处理,然后才交由内部元素进行处理 -->
<div v-on:click.capture="doThis">...</div>

<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</div>
<!-- 点击事件将只会触发一次 -->
<a v-on:click.once="doThis"></a>
<!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 -->
<!-- 而不会等待 `onScroll` 完成  -->
<!-- 这其中包含 `event.preventDefault()` 的情况 -->
<div v-on:scroll.passive="onScroll">...</div>

Vue事件还提供大量的按键修饰符
如常用的回车提交

<!-- 只有在 `key` 是 `Enter` 时调用 `vm.submit()` -->
<input v-on:keyup.enter="submit">
posted @ 2020-02-07 15:52  文鹏  阅读(1334)  评论(0编辑  收藏  举报