- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title></title>
- <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
- <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
- <style>
- .pink{
- width: 400px;
- height: 400px;
- background-color: pink;
- }
- .orange{
- width: 300px;
- height: 300px;
- background-color: orange;
- }
- .blue{
- width: 200px;
- height: 200px;
- background-color:rebeccapurple;
- }
- .green{
- width: 100px;
- height: 100px;
- background-color: green;
- }
- </style>
- </head>
- <body>
- <!-- 定义边界 -->
- <div id="app">
- <p>冒泡事件</p>
- <div class="pink" @click="pink">
- <div class="orange" @click="orange">
- <div class="blue" @click="blue">
- <div class="green" @click.stop="green"></div>
- </div>
- </div>
- </div>
- <p>点击夸你</p>
- <button @click.once="dosub">提交</button>
- </body>
- <script type="text/javascript">
- // 绑定边界 ES6具体体现
- new Vue({
- el: '#app',
- data() {
- return {
- f200: 'f200'
- };
- },
- methods: {
- pink() {
- alert("pink");
- },
- orange() {
- alert("orange");
- },
- blue() {
- alert("blue");
- },
- green() {
- alert("green");
- },
- dosub(){
- alert("兄弟,点的好");
- }
- }
- })
- </script>
- </html>
-
冒泡事件


事件只能单击一次

冒泡事件是指在Web开发中的事件传播过程中,事件从DOM树的最底层元素(通常是最具体的元素)向上冒泡到DOM树的根节点的过程。这种事件传播模型允许开发者在更高层次的元素上监听和处理事件,而不需要在每个具体的元素上都添加事件处理程序。
冒泡事件的传播过程可以简要描述如下:
- 事件首先从触发它的元素开始,然后向上冒泡到DOM树的根节点。
- 在这个过程中,每个祖先元素都有机会捕获并处理事件,如果它们注册了相应的事件处理程序。
- 如果事件处理程序返回
true,事件将继续冒泡,直到到达根节点。- 如果事件处理程序返回
false或没有返回值,事件将停止冒泡,不会继续向上传播。
冒泡事件允许开发者在父元素上注册事件处理程序,以便捕获子元素触发的事件,从而提高了事件处理的效率和可维护性。

- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>表单</title>
- <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
- </head>
- <body>
- <div id="app">
- 姓名:<input name="name" v-model="name"/><br />
- 密码:<input type="password" v-model="pwd"/><br />
- 性别:<span v-for="s in sexList">
- <input type="radio" :name="sex" v-model="sex" :value="s.id"/>{{s.name}}
- </span><br />
-
- 籍贯:<select name="myAddr" v-model="myAddr">
- <option v-for="a in address" :value="a.id">{{a.name}}</option>
- </select><br />
-
- 爱好:<span v-for="h in hobby">
- <input type="checkbox" v-model="myLike" name="myLike" :value="h.id"/>{{h.name}}
- </span><br />
-
-
- 简介:<textarea v-model="sign" cols="20" rows="2"></textarea><br />
- 是否同意:<input type="checkbox" v-model="ok"/><br />
- <button v-show="ok" @click="dosub">提交</button>
- </div>
- <script type="text/javascript">
- new Vue({
- el:'#app',
- data(){
- return {
- name:'',
- pwd:'',
- sexList:[
- { name:'男', id:1 },
- { name:'女', id:2 },
- { name:'不详', id:3 }
- ],
- hobby:[
- { name:'唱', id:1 },
- { name:'跳', id:2 },
- { name:'Rap', id:3 },
- { name:'篮球', id:4 }
- ],
- myLike:[],
- address:[
- { name:'湖南', id:1 },
- { name:'湖北', id:2 },
- { name:'河南', id:3 },
- { name:'河北', id:4 }
- ],
- myAddr:null,
- sign:null,
- ok:false,
- sex:null
- };
- },
- methods:{
- dosub(){
- var obj = {};
- obj.name = this.name;
- obj.pwd = this.pwd;
- obj.sex = this.sex;
- obj.address = this.myAddr;
- obj.love = this.myLike;
- obj.sign = this.sign;
- console.log(obj);
- }
- }
- });
- </script>
- </body>
- </html>
效果图:

自定义事件
监听事件:$on(eventName)
触发事件:$emit(eventName)
注1:Vue自定义事件是为组件间通信设计
vue中父组件通过prop传递数据给子组件,而想要将子组件的数据传递给父组件,则可以通过自定义事件的绑定
父Vue实例->Vue实例,通过prop传递数据
子Vue实例->父Vue实例,通过事件传递数据
注2:事件名
不同于组件和prop,事件名不存在任何自动化的大小写转换。而是触发的事件名需要完全匹配监听这个事件所用的名称
建议使用“短横线分隔命名”,例如:three-click
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>组件传参父传子</title>
- <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
- </head>
- <body>
- <div id="app">
- <p>自定义组件</p>
- <my-<button type="button">liao</button>
- </div>
-
- <script type="text/javascript">
- new Vue({
- el:'#app',
- components:{
- 'mybutton':{
- template:''
- }
- },
- data(){
- return {
- msg:'123'
- };
- },
- methods:{
- fun1(){
- alert("fun1");
- }
- }
- });
- </script>
- </body>
- </html>
效果图:

- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>组件传参父传子</title>
- <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
- </head>
- <body>
- <div id="app">
- <p>自定义组件</p>
- <button type="button">liao</button><br />
-
-
- <p>组件通信——父传子</p>
- <my-button m="纸"></my-button>
-
-
- <p>组件通信——父传子(纸)</p>
- <my-button m="翔" n="10"></my-button>
- </div>
-
- <script type="text/javascript">
- new Vue({
- el:'#app',
- components:{
- 'my-button':{
- props:['m','n'],
- template:'',
- data:function(){
- return {
- n:1
- }
- },
- methods:{
- clickMe(){
- this.n++;
- }
- }
- }
- },
- });
- </script>
- </body>
- </html>
效果图:

- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>组件传参</title>
- <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js"></script>
- </head>
- <body>
- <div id="app">
- <p>组件通信——子传父</p>
- <my-button m="料" n="10" @xxx='getParam'></my-button>
- </div>
-
- <script type="text/javascript">
- new Vue({
- el:'#app',
- components:{
- 'my-button':{
- props:['m','n'],
- template:'',
- data:function(){
- return {
- count:1
- }
- },
- methods:{
- clickMe(){
- let name = '来了';
- let bname = '开始来了';
- let info = '我tm来了';
- this.$emit('xxx', name, bname, info);
- }
- }
- }
- },
- data(){
- return {
- msg:'1234'
- };
- },
- methods: {
- getParam(a, b, c){
- console.log(a, b, c);
- }
- }
- });
- </script>
- </body>
- </html>
效果图:
