首页 > 其他分享 >组件通信深入

组件通信深入

时间:2023-02-20 23:25:47浏览次数:38  
标签:name default money 通信 Son export 组件 深入

1.组件通信自定义事件深入

父组件给子组件绑定原生DOM事件

<template>
    <div>
      <!-- 此处的Son为组件Father的子组件 -->
        <Son @click="Dome"></Son>
			<!-- 此时@click会被认为是组建的自定义事件需要在子组件中用$emit触发绑定事件 -->
       	<Son @click.native="Dome"></Son>
			<!--   native:原生的  将组建的自定义事件转化为DOM的原生事件
      其原理就是给子元素的根节点绑定了单击事件-->
      <button @click="Dome">按钮绑定自定义事件,没办法触发没有意义</button>
    </div>
</template>

<script>
import Son from './components/Son.vue'; 
    export default {
        name:'Father',
        components:{
            Son,
        },
        methods:{
            Dome(){
                alert("绑定Son组件的单击事件Dome被执行了")
            }
        }
    };
</script>

  

2.v-model深入

<template>
    <div> 
        {{ textData }}
        <input type="text" v-model="textData">
        <!--   实现v-model功能  
          1.给input框绑定一个value值textData
          2.触发input事件(@input 表单元素文本发生变化时会执行)
          3.变化后的textData再赋值给textData
          ($event.target.value 当前DOM元素变化后的value值 )
          -->
        <input type="text" :value="textData" @input="textData=$event.target.value" >
				 <!--   实现父子组件数据同步功能  
          1.给子组件传递数据textData
          2.给子组件绑定自定义事件@vmodel 回调 将自定义事件的返回值赋给textData
          -->
        <Son :textData="textData" @vmodel="textData=$event"></Son>
				<!-- :textData="textData" @vmodel="textData=$event" 等同于 v-model="textData"  -->
        <Son v-model="textData"></Son>
    </div>
</template>

<script>
import Son from './components/Son.vue'; 
    export default {
        name:'Father',
        components:{ Son, },
        data() {
            return {
                textData:'我是数据'
            }
        },
    };
</script>
<template>
  <div class="Son" >
    我是Son组件
		<!--2.将textData的值赋给文本框的值value 
    		3.触发input事件 调用自定义事件vmodel,将input框最新的值传给返回给父组件 -->
    <input type="text" :value="textData" @input="$emit('vmodel',$event.target.value)" >
  </div>
</template>

<script>
export default {
    // 1.接收父组件传过来的值textData
    props:['textData'],
    name:'Son',
}
</script>

3.sync修饰符

<template>
    <div> 
      我今年{{ age }}岁。<br>
      <Son :age="age" @updata:age="age=$event"></Son>
			<!-- .sync修饰符等同于   @updata:age="age=$event"
           :age.sync="age"   给子组件传递了一个age数据
           并给子组件绑定了一个@updata:age事件
      -->
      <Son :age.sync="age" ></Son>
    </div>
</template>

<script>
import Son from './components/Son.vue'; 
    export default {
        name:'Father',
        components:{ Son, },
        data() {
            return {
                age:18,
            }
        },
    };
</script>
<template>
  <div class="Son" >
    现在他 {{ age }}岁
    <button @click="$emit('updata:age',age-1)">过了一年</button>
  </div>
</template>

<script>
export default {
    props:['age'],
    name:'Son',
}
</script>

4.$attrs 和 $listener

<template>
    <div> 
       <Son 
       type="primary" 
       title="提示"
       @click="Dome"
       ></Son>       
    </div>
</template>

<script>
import Son from './components/Son.vue'; 
    export default {
        name:'Father',
        components:{ Son,},
        methods:{
            Dome(){
                alert('提示我')
            },
        }
    };
</script>

:::tips
$attrs 用于接受父组件传来的参数 type="primary" title="提示"
当子组件用props接收参数 title="提示" $attrs 接受的参数将会将 title="提示" 去掉剩下 type="primary"
使用的时候必须配合 v-bind="$attrs" 不能简写
$listeners 用于接收父组件传过来的自定义事件 使用时必须 v-on="$listeners" 不能写成简写形式
:::

<template>
  <div class="Son" >
    <a title="title">
      <el-button v-bind="$attrs" v-on="$listeners" > 加载中</el-button>
      <br>
      <button @click="Dome" v-on="" >nininin</button>
    </a>
  </div>
</template>
<script>
export default {
  name:"Son",
  props:['title'],
  methods:{
    Dome(){
      console.log(this.$listeners)
    }
  }
}
</script>

5.$children和$parent

1 $children 可以拿到父组件中的所有子组件,值为一个数组
2 $parent 可以拿到子组件的父组件

<template>
    <div> 
        {{ money }}        
        <button @click="getSonMoney(100)">向son借钱100元</button>
        <button @click="getSon2Money(200)">向son借钱200元</button>
        <button @click="getAllMoney(300)">向son和son2借钱300元</button>
        <Son ref="son"></Son>
        <Son2 ref="son2"></Son2>
    </div>
</template>
<script>
import Son from './components/Son.vue'; 
import Son2 from './components/Son2.vue'; 
    export default {
        name:'Father',
        components:{ Son,Son2},
        data(){
            return{
                money:300000,
            }
        },
        methods:{
            getSonMoney(money){
                // ref 标签的所有属性
                this.money+=money
                //拿到子组件的money值并计算赋值
                this.$refs.son.money-=money
            },
            getSon2Money(money){
                this.money+=money
                this.$refs.son2.money-=money
            },
            getAllMoney(money){
                this.money+=2*money
              //$children 可以拿到所有子组件,值为一个数组
                this.$children.forEach(item => {
                    item.money-=money
                });
            },         
        }
    };
</script>
<template>
  <div class="Son" >
      <button  @click="getMoney(100)">向father借钱100元</button>{{ money }}
  </div>
</template>
<script>
export default {
  name:"Son",
  data() {
    return {
      money:10000,
    }
  },
  methods:{
    getMoney(money){
      this.money+=money
      this.$parent.money-=money
    }
  }
}
</script>
<template>
  <div class="Son2">
    <button @click="getMoney(200)">向father借钱200元</button>{{ money }}
  </div>
</template>
<script>
export default {
  name: 'Son2',
  data() {
    return {
      money: 13000,
    }
  },
  methods:{
    getMoney(money){
      this.money+=money
      //拿到自组件的父组件并计算赋值
      this.$parent.money-=money
    }
  }
}
</script>

6.mixin 混入(混合)

续5
1 将son和son2中相同的部分摘取出来 放在hunhe.js文件中

export default {
  // 将son和son2中相同的部分摘取出来 放在hunhe.js文件中
    methods: {
        getMoney(money) {
            this.money += money
            this.$parent.money -= money
        }
    }
}

2 在Son和Son2组件中引入hunhe.js并进行使用

<template>
  <div class="Son" >
      <button  @click="getMoney(100)">向father借钱100元</button>{{ money }}
  </div>
</template>
<script>
import hunhe from './hunhe'
export default {
  mixins:[hunhe],
  name:"Son",
  data() {
    return {
      money:10000,
    }
  },
}
</script>
<template>
  <div class="Son2">
    <button @click="getMoney(200)">向father借钱200元</button>{{ money }}
  </div>
</template>
<script>
import hunhe from './hunhe'
export default {
  mixins:[hunhe],
  name: 'Son2',
  data() {
    return {
      money: 13000,
    }
  },
}
</script>

标签:name,default,money,通信,Son,export,组件,深入
From: https://www.cnblogs.com/my-hsm/p/17139385.html

相关文章

  • Vue 非单文件组件(不常用)3步骤(创建、注册、使用)
    Vue中使用组件的三大步骤:1、定义组件(创建)2、注册组件3、使用组件(写组件标签)一、如何定义一个组件?使用Vue.extend(options)创建,其中options和newVue(options)时传入......
  • 组件间通信
    组件其他根组件和组件一些问题 -newVew()--->管理div---》根组件-自己再定义的全局,局部是组件-组件有自己的html,css,js---》数据,事件。。。-在组件中......
  • Vue3之v-show不能放置于自定义组件
    控制台警告Runtimedirectiveusedoncomponentwithnon-elementrootnode.Thedirectiveswillnotfunctionasintended.原因意思是自定义指令不能放到组件上,而......
  • Vue 3 兄弟组件间传值 | mitt.js
    Vue3中兄弟间传值可以使用Vuex,但小项目使用过于庞大,我们可以使用mitt进行兄弟组件间传值。操作步骤第一步:安装mittnpmimitt第二步:创建文件(例如:eventBus.js)impo......
  • 客户端跟redis的一次通信流程
    1.在redis启动初始化的时候,redis会将连接应答处理器跟AE_READABLE事件关联起来,接着如果一个客户端跟redis发起连接,此时会产生一个AE_READABLE事件,然后由连接应答处理......
  • [Linux] 使用管道进行进程间通信
    什么是管道父进程向子进程发送消息#include<stdio.h>#include<unistd.h>#include<string.h>#include<errno.h>intmain(){ intfd[2]; intret=pipe(fd);......
  • java基础 -- 反射深入浅出与CLass源码解析
    java反射在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的......
  • 智能通信网关管理设备(借助工业智能网关实现工业设备在线监控和维护)
    方案背景工厂的设备都需要定时检修维护,保障稳定运行和安全生产。无论是日常检查还是故障维护,都需要花费相当多的人力、物力和资金,也需要面对停工维护带来的损失。在传统维护......
  • 蓝牙、WIFI、5G、窄带物联网的无线通信技术有哪些?
    无线通信模块是智能终端接入物联网的核心,让各终端设备接入物联网获得信息传输能力,将物与物之间联系起来。它连接物联网感知层和应用层,感知层终端设备产生的数据通过无线通信......
  • vue组件
    1组件其他#根组件和组件一些问题 -newVue()--->管理div--->根组件-自己再定义的全局,局部是组件-组件有自己的html,css,js---》数据,事件。。。。-在组......