父子,子父,非父子组件通信

父子组件通信

父亲的数据给子集

父组件向子组件传值

  1. ??? 子组件在props中创建一个属性,用于接收父组件传过来的值;
  2. ??? 父组件 引入子组件-->注册子组件-->引用子组件;
  3. ??? 在子组件标签中添加子组件props中创建的属性;
  4. ??? 将所要传递的值赋值给该属性。

props:

  1. prop类型:通常你希望每个prop都有指定的数据类型,你可以以对象的形式列出prop,对象的属性的名称和值分别对应了prop的值和类型。
  2. 单向数据流:所有的prop都使得其父子prop形成一个单向数据流,即单向下数据流。父级prop的更新会单向流动到子组件中,但是反过来则不行,单向数据流能防止子组件意外改变父组件的状态。额外的,每次父组件发生改变时,子组件中的prop将会更新为最新的值。
  • 子组件通过props选项来接收属性,接收到的属性可以像全局变量一样在组件的模板中使用

props:?['aa']
  • ?属性验证??-?js是弱类型语言
?props:?{
???????'aa':?Number?//?String?Boolean?Object?Array?
       }
  • vue3.0使用ts,ts是强类型
??<div?id="app">
????<Father></Father>
??</div>
??<template?id="father">
????<div>
??????<!--?使用单项数据绑定将一个数据绑定给一个自定义的属性?-->
??????<Son?:aa?=?"money"?/>
????</div>
??</template>
??<template?id="son">
????<div>
??????<p>老爸给了我?{{?aa?}}?块?</p>
??????<p>?{{?aa?+?20?}}??</p>
????</div>
??</template>

<script>
??Vue.component('Father',{
????template:?'#father',
????data?()?{
??????return?{
????????money:?4000
??????}
????}
??})
??Vue.component('Son',{
????template:?'#son',
????/*?子组件通过props选项来接收属性,接收到的属性可以像全局变量一样在组件的模板中使用?*/
????//?props:?['aa']
????/*?属性验证??-?js是弱类型语言*/
????props:?{
??????//?'aa':?Number?//?String?Boolean?Object?Array?
??????'aa':?{
????????validator?(?val?)?{
??????????return?val?>?3000
????????}
??????}
??????/*?vue3.0使用ts,ts是强类型?*/
????}
??})
??new?Vue({
????el:?'#app'
??})
</script>

###### 子父组件通信
子的数据给父亲

子组件向父组件传值

  1. ??? 子组件需要以某种方式,例如点击事件的方法来触发一个自定义事件
  2. ??? 将所需要传递的值作为$emit的第二个参数,该值将作为实参传给响应自定义事件的方法
  3. ??? 父组件 引入子组件-->注册子组件-->引用子组件
  4. ??? 在子组件标签上绑定对自定事件的监听

自定义事件

  1. ?? ?父组件通过$on监听事件,事件处理函数的参数则为接收的数据
  2. ?? ?子组件通过$emit可以触发事件,第一个参数为要触发的事件,第二个事件为要传递的数据?
  3. ?? ?sync修饰符:对一个 prop 进行双向绑定
<div?id="app">
????<Father></Father>
??</div>
??<template?id="father">
????<div>
??????<p>?儿子给我发了?{{?xiaojinku?}}?的红包?</p>
??????<!--?自定义事件?-->
??????<[email protected]?=?"get"/>
????</div>
??</template>
??<template?id="son">
????<div>
??????<[email protected]?=?"give">?发红包?</button>
????</div>
??</template>
</body>

<script>
??Vue.component('Father',{
????template:?'#father',
????data?()?{
??????return?{
????????xiaojinku:?0
??????}
????},
????methods:?{
??????get?(?val?)?{
????????this.xiaojinku?=?val
??????}
????}
??})
??Vue.component('Son',{
????template:?'#son',
????data?()?{
??????return?{
????????hongbao:?2000
??????}
????},
????methods:?{
??????give?()?{
????????this.$emit('hongbao',this.hongbao)
??????}
????}
??})
??new?Vue({
????el:?'#app'
??})
</script>

非父子组件通信(兄弟姐妹通信)

兄弟通信 找父作为中间值
子传父->父传子


<div?id="app">
????<Father></Father>
??</div>
??<template?id="father">
????<div>
??????<h3>?father组件?</h3>
??????<hr>
??????<!--?使用自定义属性形式将一个方法传递给子组件?-->
??????<Girl></Girl>
??????<hr>
??????<Son></Son>
????</div>
??</template>
??<template?id="son">
????<div>
??????<h3>?son组件?</h3>
??????<img?v-if?=?"flag"?src="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3872048339,4140466773&fm=26&gp=0.jpg"?alt="">
??????<img?v-else?src="https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2438534582,3797477605&fm=26&gp=0.jpg"?alt="">
????</div>
??</template>
??<template?id="girl">
????<div>
??????<h3>?girl组件?</h3>
??????<[email protected]?=?"hit">?揍弟弟?</button>
????</div>
??</template>
</body>

<script>
??/*?定义了实例bus?-?bus上有?$on??$emit??*/
??var?bus?=?new?Vue()
??Vue.component('Father',{
????template:?'#father',
??})
??Vue.component('Son',{
????template:?'#son',
????/*?组件是独立的,自己的数据自己改?*/
????data?()?{
??????return?{
????????flag:?true?
??????}
????},
????mounted?()?{
??????/*?mounted表示挂载结束,也就是我们能看到界面了,也就是事情做完了?*/
??????/*?这个函数会自动执行?*/
??????var?_this?=?this?
??????/*?通过bus绑定了自定义事件?*/
??????bus.$on('ku',function?()?{
????????_this.flag?=?!_this.flag?
??????})
????}
??})
??Vue.component('Girl',{
????template:?'#girl',
????methods:?{
??????hit?()?{
????????bus.$emit('ku')
??????}
????}
??})
??new?Vue({
????el:?'#app'
??})

原文地址:https://www.cnblogs.com/hff-syt/p/11730207.html

时间: 2024-10-06 12:11:14

父子,子父,非父子组件通信的相关文章

87 全局和局部组件, 子父和父子之间的通信 混入 插槽 路飞导航栏

主要内容: 1  全局组件: a : 定义一个全局组件 Vue.component( 'global-component', { template: `<div> 注意: template一定要包一层div <h3>{{wanrong}}</h3> <h2>{{wanrong}}</h2> </div>`, data() { return { wanrong: 'hello', } } } ); 2  全局组件的使用的两种方式: a:

Vue2.0的三种常用传值方式、父传子、子传父、非父子组件传值

Vue常用的三种传值方式有: 父传子 子传父 非父子传值 引用官网的一句话:父子组件的关系可以总结为 prop 向下传递,事件向上传递.父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息 1. 父组件向子组件进行传值 父组件: <template> <div> 父组件: <input type="text" v-model="name"> <!-- 引入子组件 --> <child :abc=

vue的父子组件间传值以及非父子间传值

Vue组件间的传值方式: 父传子 子传父 非父子间传值 1.首先父组件传值给子组件,使用bind绑定属性,然后在子组件用props接收属性值. //父组件 <template> <input type="text" /> <br/> <child :inputValue="inputValue"></child> </template> <script> import child f

vue.js 创建组件 子父通信 父子通信 非父子通信

1.创建组件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>创建组件</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> &l

【vue】父组件主动调用子组件 /// 非父子组件传值

一  父组件主动调用子组件: 注意:在父组件使用子组件的标签上注入ref属性,例如: <div id="home"> <v-header ref="header"></v-header> <hr> 首页组件 <button @click="getChildData()">获取子组件的数据和方法</button> </div> 父组件主动获取子组件的数据和方法: 1

vue2.0父子组件以及非父子组件如何通信

1.父组件 >>> 子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: <parent> <child :child-msg="msg"></child> //这里必须要用 - 代替驼峰 </parent> data(){ return { msg: [1,2,3] }; } 子组件通过props来接收数据: 方式1: props: ['childMsg'] 方式2 : props: { chi

Vue父子组件及非父子组件如何通信

1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: 子组件通过props来接收数据: 方式1: 方式2 : 方式3: 这样呢,就实现了父组件向子组件传递数据. 2.子组件与父组件通信 那么,如果子组件想要改变数据呢?这在vue中是不允许的,因为vue只允许单向数据传递,这时候我们可以通过触发事件来通知父组件改变数据,从而达到改变子组件数据的目的. 父组件: 3.非父子组件通信 如果2个组件不是父子组件那么如何通信呢?这时可以通过eventHub来实现

Vue组件通信之非父子组件传值

前言: 如果想要了解非父子关系的组件传值,最好是在了解父传子和子传父的基础上在来了解非父子传值可能会有更透彻的思路. 因为非父子传值是通过定义事件总线来代理实现父传子+子传父从而实现的传值方式. 这是我总结的父子传值相关的知识,可供参考: https://www.cnblogs.com/ViavaCos/p/11712131.html 然后大概回顾一下父子传值的过程: 根据上述信息可知,如果两个组件需要传递值那么需要这两个组件之间是父子关系才能传递数据. 那么如果有这样一个组件,既可以帮你传递数

vue非父子组件间通信

有时候非父子关系的组件也需要通信.在简单的场景下,使用一个空的Vue实例作为中央事件总线: 有时候非父子关系的组件也需要通信.在简单的场景下,使用一个空的 Vue 实例作为中央事件总线: var bus = new Vue() // 触发组件 A 中的事件 bus.$emit('id-selected', 1) // 在组件 B 创建的钩子中监听事件 bus.$on('id-selected', function (id) { // ... }) 在更多复杂的情况下,你应该考虑使用专门的 状态管