你不能不了解的Vue【模板语法下集】!

简介: 你不能不了解的Vue【模板语法下集】!

一.事件处理器

1.什么是事件处理?

在 Vue 中,事件处理指的是将特定的DOM事件与对应的处理函数进行绑定,当事件触发时,相应的处理函数将被执行,从而实现对用户交互操作的响应

Vue 通过 v-on 指令(或简写符号 @)来绑定事件处理函数到DOM元素上

2.事件冒泡

事件冒泡(Event Bubbling)是指在DOM结构中,当一个元素上的事件被触发时,该事件将会向父元素(包括祖先元素)逐级传播,直到根节点。这样设计的目的是为了简化事件的处理和管理。

具体来说,当一个元素触发某个事件时,比如点击事件(click),该事件首先在触发元素上被执行,然后事件会依次在其父元素上执行,再在父元素的父元素上执行,一直向上直到根节点。这种向上传播的过程就是事件冒泡

2.1基础代码

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
     <!-- 1.导入vue在线依赖-->
  <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
    <title>事件处理器</title>
    <style  type="text/css">
       .a{
         background-color: aqua;
         width: 400px;
         height: 400px;
       }
       .b{
               background-color: red;
             width: 300px;
             height: 300px;
       }
       .c{
               background-color: yellow;
             width: 200px;
             height: 200px;
       }
       .d{
               background-color: green;
             width: 100px;
             height: 100px;
       }
    </style>
  </head>
  <body>
    <div  id="app">
      <div  class="a"  @click="fun1">
        <div  class="b"  @click="fun2">
          <div class="c"  @click="fun3">
            <div  class="d" @click="fun4"> </div>
          </div>
        </div>
      </div>
    </div>
    <!-- 构建vue实例,绑定实例 -->
    <script  type="text/javascript">
      new Vue({
        el:"#app",
        data(){
          return {
            msg:'刘兵要上百星王者' ,
            };
        },methods:{
        fun1(){
          alert("fun1")
        },
        fun2(){
          alert("fun2")
        },
        fun3(){
          alert("fun3")
        },
        fun4(){
          alert("fun4")
        },
        }
      });
    </script>
  </body>
</html>
效果图

这一次点击一个颜色就会弹出所有个下拉框

2.2解决办法(.stop)

效果图展示

这一次点击一个颜色就会弹出一个下拉框

3.限制次数点击(.once)

3.1代码

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
     <!-- 1.导入vue在线依赖-->
  <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
    <title>事件处理器</title>
  </head>
  <bod
      <input :value="msg" />
      <button @click="clickMe">吱吱吱吱</button>
    </div>
    <!-- 构建vue实例,绑定实例 -->
    <script  type="text/javascript">
      new Vue({
        el:"#app",
        data(){
          return {
            msg:'刘兵要上百星王者' ,
            };
        },methods:{
        clickMe(){
          console.log(this.msg)
        }
        }
      });
    </script>
  </body>
</html>
效果图

3.2修改代码

 效果图

4.事件修饰符

事件修饰符

 Vue通过由点(.)表示的指令后缀来调用修饰符,

 .stop

 .prevent

 .capture

 .self

 .once

 <!-- 阻止单击事件冒泡 -->

 <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>

 <!-- 只当事件在该元素本身(而不是子元素)触发时触发回调 -->

 <div v-on:click.self="doThat">...</div>

 <!-- click 事件只能点击一次 -->

 <a v-on:click.once="doThis"></a>


二.表单的综合案例

1.取值,和绑定值

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
  <title>表单的综合案例</title>
</head>
<body>
  <div id="app">
    姓名:<input v-model="form.name" /><br />
    密码:<input v-model="form.password" type="password" /><br />
    性别:
    <div v-for="sex in sexList">
      <input type="radio" name="sex" v-model="form.sex" :value="sex.id" />{{sex.name}}
    </div>
    籍贯:
    <select name="address" v-model="form.address">
      <option value="">请选择</option>
      <option v-for="addr in addressList" :value="addr.id">{{addr.name}}</option>
    </select><br />
    爱好:
    <span v-for="hobby in hobbyList">
      <input type="checkbox" v-model="form.hobbies" :value="hobby.id" />{{hobby.name}}
    </span><br />
    个人简介:<textarea v-model="form.intro" rows="5"></textarea><br />
    同意:<input type="checkbox" v-model="form.agree" /><br />
    <button v-if="form.agree" @click="submitForm">提交</button>
  </div>
  <script type="text/javascript">
    new Vue({
      el: '#app',
      data() {
        return {
          sexList: [
            {id: 1, name: '男'},
            {id: 2, name: '女'},
            {id: 3, name: '保密'}
          ],
          hobbyList: [
            {id: 1, name: '王者'},
            {id: 2, name: '吃鸡'},
            {id: 3, name: 'cf'},
            {id: 4, name: '部落冲突'}
          ],
          addressList: [
            {id: 1, name: '北京'},
            {id: 2, name: '上海'},
            {id: 3, name: '广州'},
            {id: 4, name: '深圳'}
          ],
          form: {
            name: '刘兵',
            password: 'wssb',
            sex: 1,
            address: '',
            hobbies: [],
            intro: '',
            agree: false
          }
        };
      },
      methods: {
        submitForm() {
          console.log(this.form);
          alert('提交成功');
        }
      }
    });
  </script>
</body>
</html>

2.展示效果

三.组件通信(主讲自定义事件)

1.组件通信共包括

  1. Props & Events(父组件向子组件通信):父组件通过props将数据传递给子组件,子组件通过events触发父组件的方法来实现通信。
  2. 自定义事件(子组件向父组件通信):子组件通过$emit触发自定义事件并传递数据,父组件通过监听子组件的自定义事件来接收数据。
  3. 中央事件总线(非父子组件通信):创建一个新的Vue实例作为中央事件总线,任何组件都可以通过该实例的emit和on方法进行通信。
  4. Vuex(大规模应用状态管理):Vuex是Vue官方提供的状态管理库,用于管理共享状态,可在多个组件之间进行通信。

自定义组件

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
     <!-- 1.导入vue在线依赖-->
  <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
    <title>父传子通信</title>
    <!-- 2.定义vue所管理的边界(有且只有一个根节点) -->
  </head>
  <body>
      <!-- 2.定义vue所管理的边界(有且只有一个根节点) -->
    <div  id="lz">
      <p>自定义组件</p>
      <my-button>刘兵是狗</my-button>
    </div>
    <!-- 构建vue实例,绑定实例 -->
    <script  type="text/javascript">
      new Vue({
        el:"#lz",
        components:{
          'my-button':{
            template:'<button>刘兵是狗</button>'
          }
        },
        data(){
          return {
            msg:'刘兵要上百星王者' ,
          };
        },
        methods:{
          function:{
          fun1(){
            alert(fun1)
          } 
          }
        }
      })
    </script>
  </body>
</html>

效果图

2.父传子通信

代码

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
     <!-- 1.导入vue在线依赖-->
  <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
    <title>父传子通信</title>
    <!-- 2.定义vue所管理的边界(有且只有一个根节点) -->
  </head>
  <body>
      <!-- 2.定义vue所管理的边界(有且只有一个根节点) -->
    <div  id="lz">
      <p>自定义组件</p>
      <my-button>刘兵是狗</my-button>
      <h1>----------------------------</h1>
      <p>组件通信---父传子</p>
      <my-button m='lb'>刘兵是狗</my-button>
      <p>组件通信---父传子(2)</p>
      <my-button m='nb' n="10">刘兵是狗</my-button>
    </div>
    <!-- 构建vue实例,绑定实例 -->
    <script  type="text/javascript">
      new Vue({
        el:"#lz",
        components:{ 
          'my-button':{
            template:'<button @click="onclikMe">被点击了{{m}}who{{n}}次</button>',
            props:['m','n'],
            data:function(){
              return {n:1}
            },
            methods:{
              onclikMe(){
                this.n++;
              }
            }
          }
        },
        data(){
          return {
            msg:'刘兵要上百星王者' ,
          };
        },
        methods:{
          function:{
          fun1(){
            alert(fun1)
          } 
          }
        }
      })
    </script>
  </body>
</html>

代码分析

Vue实例中的components选项定义了一个名为my-button的自定义组件。这个组件有一个template模板,包含一个按钮元素,按钮上显示了父组件传递过来的属性mn的值。组件还定义了一个data函数,返回一个对象,包含一个属性n,初始化为1。组件还定义了一个方法onclikMe,用于处理按钮的点击事件,每次点击时将n的值加1

3.子传父通信

代码

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
         <!-- 导入vue在线依赖 -->
        <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
        <title>子传父通信</title>
    </head>
    <body>
        <div id="lz">
            <p>组件通信---子传父</p>
            <my-button m='lb' @xxx='getParam'>刘兵是狗</my-button>
        </div>
        <script type="text/javascript">
            Vue.component('my-button', {
                template: '<button @click="onclickMe">被点击了{{ m }}</button>',
                props: ['m'],
                methods: {
                    onclickMe() {
                        let name = "刘兵土狗";
                        let book = "如何才能成为舔狗";
                        let price = "1688";
                        this.$emit('xxx', name, book, price);
                    }
                }
            });
            new Vue({
                el: "#lz",
                methods: {
                    getParam(a, b, c) {
                        console.log(a, b, c);
                    }
                }
            });
        </script>
    </body>
</html>

分析

  1. my-button组件的methods选项中,定义了onclickMe方法。当按钮被点击时,该方法将设置name为"刘兵土狗", book为"如何才能成为舔狗",price为"1688",然后通过this.$emit方法触发名为xxx的自定义事件,并传递这三个参数。
  2. 在Vue实例的methods选项中,定义了一个名为getParam的方法。该方法用于处理子组件传递的参数,并在控制台打印输出这三个参数的值。

总结:这段代码演示了子组件向父组件传递数据的通信方式。通过自定义组件my-button,当按钮被点击时,子组件会通过this.$emit方法触发一个自定义事件xxx,并向父组件传递参数namebookprice。父组件通过监听这个自定义事件@xxx,在事件处理函数getParam中获取传递的参数进行相应的处理。输出结果通过调用console.log()方法在浏览器控制台中显示。

效果展示

四.今天分享就到这里感谢阅读

相关文章
|
20天前
|
移动开发 JavaScript API
Vue Router 核心原理
Vue Router 是 Vue.js 的官方路由管理器,用于实现单页面应用(SPA)的路由功能。其核心原理包括路由配置、监听浏览器事件和组件渲染等。通过定义路径与组件的映射关系,Vue Router 将用户访问的路径与对应的组件关联,支持哈希和历史模式监听 URL 变化,确保页面导航时正确渲染组件。
|
24天前
|
监控 JavaScript 前端开发
ry-vue-flowable-xg:震撼来袭!这款基于 Vue 和 Flowable 的企业级工程项目管理项目,你绝不能错过
基于 Vue 和 Flowable 的企业级工程项目管理平台,免费开源且高度定制化。它覆盖投标管理、进度控制、财务核算等全流程需求,提供流程设计、部署、监控和任务管理等功能,适用于企业办公、生产制造、金融服务等多个场景,助力企业提升效率与竞争力。
83 12
|
20天前
|
JavaScript 前端开发 开发者
Vue中的class和style绑定
在 Vue 中,class 和 style 绑定是基于数据驱动视图的强大功能。通过 class 绑定,可以动态更新元素的 class 属性,支持对象和数组语法,适用于普通元素和组件。style 绑定则允许以对象或数组形式动态设置内联样式,Vue 会根据数据变化自动更新 DOM。
|
20天前
|
JavaScript 前端开发 数据安全/隐私保护
Vue Router 简介
Vue Router 是 Vue.js 官方的路由管理库,用于构建单页面应用(SPA)。它将不同页面映射到对应组件,支持嵌套路由、路由参数和导航守卫等功能,简化复杂前端应用的开发。主要特性包括路由映射、嵌套路由、路由参数、导航守卫和路由懒加载,提升性能和开发效率。安装命令:`npm install vue-router`。
|
3月前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
161 1
|
2月前
|
JavaScript 安全 API
iframe嵌入页面实现免登录思路(以vue为例)
通过上述步骤,可以在Vue.js项目中通过 `iframe`实现不同应用间的免登录功能。利用Token传递和消息传递机制,可以确保安全、高效地在主应用和子应用间共享登录状态。这种方法在实际项目中具有广泛的应用前景,能够显著提升用户体验。
119 8
|
2月前
|
存储 设计模式 JavaScript
Vue 组件化开发:构建高质量应用的核心
本文深入探讨了 Vue.js 组件化开发的核心概念与最佳实践。
86 1
|
4月前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
116 58
|
3月前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
4月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
71 1
vue学习第一章

热门文章

最新文章