zoukankan      html  css  js  c++  java
  • 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">
    
  • 相关阅读:
    Linux面试题大全
    数据库学习002
    数据学习001
    003
    002
    001
    金蝶清空日志数据库脚本
    表格批量导入金蝶专业版销售订单
    金蝶单据清空记账标志
    金蝶单据字段审核后可修改
  • 原文地址:https://www.cnblogs.com/wenpeng/p/12273333.html
Copyright © 2011-2022 走看看