返回顶部
首页 > 资讯 > 前端开发 > JavaScript >八种vue实现组建通信的方式
  • 790
分享到

八种vue实现组建通信的方式

2024-04-02 19:04:59 790人浏览 安东尼
摘要

目录一、组件通信1、props 父组件--->子组件通信2、$emit 子组件--->父组件传递3、bus(事件总线) 兄弟组件通信4、$parent、$children

一、组件通信

1、props 父组件--->子组件通信

  • 父组件---属性的方式传值给子组件
  • 子组件---props方式接收数据

<Son :datas="fData"></Son>

<script>
import Son from '@/components/son'
  export default{
    name:'Father',
    components:{Son},
    data(){
      return{
        fData:'我是父组件向子组件传递的值-props方式'
      }
    }
  }
</script>

子组件props接受的参数名称,要与父组件传递时定义的属性名一致


<template>
  <div>我是父组件的数据:{{fData}}</div>
  <div @click=changeData>我是父组件传递修改后的数据:{{mydata}}</div>
</template>
<script>
  export default{
    name:'Son',
    props:{
      fData:{
        type:String,
        default:''
      }
    }
    data(){
      mydata:this.fatherData
    },
    methods:{
     changeData(){
        this.mydata += '改变数据'
      }
    },
  }
</script>

注意:

  • 子组件不能够直接去修改父组件传递的值修改的:因为Vue的单向数据流机制,如果直接修改那父组件的值就被“污染”了。(props是单向绑定的(只读属性):当父组件的属性变化时,将传导给子组件,但是反过来不会)

报错信息大概是:vue使用prop通信出错:Avoid mutating a prop directly since the value will be overwritten whenever the parent

  • 解决方案:可以在子组件内定义一个变量mydata去接收fData数据
  • 参数传递类型不确定是可以这么写

props:{
    fData:{
        type:[String,Number],
        default:''
    }
}

2、$emit 子组件--->父组件传递

  • 子组件绑定自定义事件
  • $emit()第一个参数为:自定义的事件名称,第二个参数为:需要传递的数据
  • 使用 $emit() 触发更改数据子组件

<el-button @click="handleEmit">改变父组件</el-button>

<script>
 export default{
   name:'Son',
   methods:{
     handleEmit(){
       this.$emit('triggerEmit','子组件的数据')
     }
   }
 }
</script>

父组件(子组件发送的事件名称,要和父组件接受的事件名称一致)


<Son @triggerEmit="changeData"></Son>

<script>
 import Son from '@/components/son'
 export default{
   name:'Father',
   components:{Son},
   methods:{
     changeData(name){
       console.log(name) // => 我是来自子组件的数据
     }
   }
 }
</script>

$emit与props结合 兄弟组件传值

  • 父组件引入两个子组件
  • 父组件充当一个桥梁作用父组件

<childA :myName="name"></ChildA>
<ChildB :myName="name" @changeName="editName"></ChildB>  
    
export default{
  data() {
    return {
      name: '数据你好'
    }
  },
  methods: {
    editName(name){
      this.name = name
    }
  }
}


子组件B改变,接收数据


<p>姓名:{{ myName }}</p>
<button @click="changeName">修改姓名</button>
    
<script>
export default{
  props: {
    myName:String
  },
  methods: {
    changeName() {
      this.$emit('changeName', '新数据名称')
    }
}
}
</script>


子组件A接收数据


<p>姓名:{{ newName }}</p>
    
<script>
export default{
  props: {
    myName:String
  }
}
</script>

3、bus(事件总线) 兄弟组件通信

非父子组件或更多层级间组件间传值,在Vue中通过单独的事件中心来管理组件间的传值

  • 创建一个公共的bus.js文件
  • 暴露出Vue实例
  • 传递数据方,通过一个事件触发bus.$emit(方法名,传递的数据)
  • 接收数据方,在生命周期函数中,通过bus.$on(方法名,[params])来监听
  • 销毁事件,在接受数据方,通过bus.$off(方法名)销毁之后无法监听数据

import Vue from "vue"
const bus=new Vue()
export default bus


需要改变数据的组件中定义调用


<template>
  <div>
    <div>我是通信组件A</div>
    <button @click="changeName">修改姓名</button>
  </div>
</template>

<script>
import bus from "@/utils/Bus.js";
export default {
  components: {},
  data() {
    return {};
  },
  mounted() {
    console.log(bus);
  },
  methods: {
    changeName() {
      bus.$emit("editName", "数据集!");
    },
  },
};
</script>

<style lang='sCSS' scoped>
</style>

另外一个组件中同样引入bus.js文件,通过$on监听事件回调


<template>
  <div>
  <span>名称:{{name}}</span>
    <div>我是通信组件B</div>
  </div>
</template>

<script>
import  bus  from "@/utils/Bus.js";
export default {
  components: {},
  data() {
    return {name};
  },
  mounted() {
    bus.$on("editName", (name) => {
        this.name=name
      console.log(name); // 
    });
  },
  methods: {},
};
</script>

<style lang='scss' scoped>
</style>

4、$parent、$children 直接访问组件实例

  • 子组件通过---> $parent 获得父组件实例
  • 父组件通过---> $children 获得子组件实例数组

子组件---this.$parent可以获取到父组件的方法、data的数据等,并可以直接使用和执行


<template>
  <div>我是子组件</div>
</template>

<script>
export default{
  name:"Son",
  data(){
    return{
      sonTitle: '我是子组件的数据'
    }
  },
  methods:{
    sonHandle(){
      console.log('我是子组件的方法')
    }
  },
  created(){
    console.log(this.$parent)
    console.log(this.$parent.fatherTitle) // => 我是父组件的数据
    this.$parent.fantherHandle() // => 我是父组件的方法
  }
}
</script>

父组件 --- 获取子组件实例的,并且获取的实例是一个数组形式,this.$children[0]才可以获取某个组件实例,并调用组件方法和数据


<template>
  <div>
    <Son>我是父组件</Son>
  </div>
</template>

<script>
import Son from './son.vue'

export default{
  name: 'father',
  components:{
    Son
  },
  data(){
    return{
      fatherTitle: '我是父组件的数据'
    }
  },
  methods:{
    fantherHandle(){
      console.log('我是父组件的方法')
    }
  },
  mounted(){
    console.log(this.$children)
    console.log(this.$children[0].sonTitle) // => 我是子组件的数据
    this.$children[0].sonHandle() // => 我是子组件的方法
  }
}
</script>

5、$refs

ref被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。

父组件使用 $refs 获得组件实例


<template>
  <div>
    <Son ref="son"></Son>
  </div>
</template>

<script>
import Son from './son.vue'

export default{
  name: 'father',
  components:{
    Son
  },
  mounted(){
    console.log(this.$refs.son) 
  }
}
</script>

6、provide/inject(提供/注入) 多组件或深层次组件通信

provide/inject详解

  • 父组件使用 provide 注入数据
  • 子组件使用 inject 使用数据


export default{
 provide: {
   return{
     provideName: '贩卖前端仔'
   }
 }
}


至此provideName这个变量可以提供给它其下的所有子组件,包括曾孙、孙子组件等,只需要使用 inject 就能获取数据



export default{
  inject: ['provideName'],
  created () {
    console.log(this.provideName) // => "贩卖前端仔"
  }
}


  • 父组件不需要知道哪个组件使用它提供出去的数据
  • 子附件不需要知道这个数据从哪里来

7、slot(slot-scope作用域插槽) 子元素-->父元素(类似于通信)

  • 用作一个 (能被传递数据的)可重用模板,来代替已经渲染好的元素
  • 在子组件中,只需将数据传递到插槽,就像你将 prop 传递给组件一样
  • 注意:父级插槽接收内容是最外侧元素 ,必须要有属性slot-scope子元素

<template>
  <div>
    <div class="isSon">
        <slot :info='arrList'></slot>
    </div>
  </div>
</template>

<script>
export default {
  components: {},
  data() {
    return {arrList:[1,'aa','张三']};
  },
  mounted() {
  },
  methods: {
    
  },
};
</script>

父元素


<template>
<div>
    <SonG>
        <span slot-scope="props">
            <ul>
                aa
                <li v-for="item in props.info" :key="item">
                    {{item}}
                </li>
            </ul>
        </span>
    </SonG>
</div>
</template>

<script>

import SonG from '../components/SonG.vue'
export default {
   components:{
       SonG
   },
   data () {
       return {
       }
   }
}
</script>

8、vuex状态管理

  • 相当于一个公共数据的仓库
  • 提供一些方法管理仓库数据

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

到此这篇关于八种vue实现组建通信的方式的文章就介绍到这了,更多相关vue实现组建通信的方式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 八种vue实现组建通信的方式

本文链接: https://lsjlt.com/news/136094.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 八种vue实现组建通信的方式
    目录一、组件通信1、props 父组件--->子组件通信2、$emit 子组件--->父组件传递3、bus(事件总线) 兄弟组件通信4、$parent、$children...
    99+
    2024-04-02
  • vue实现组件通信的八种方法实例
    目录1、props父组件--->子组件通信2、$emit子组件--->父组件传递3、bus(事件总线)兄弟组件通信4、$parent、$children直接访问组件实例5...
    99+
    2024-04-02
  • vue 组件通信的多种方式
    目录前言一、vuex二、eventBus三、props/emit四、$parent/$children五、$attrs/$listeners六、provide/inject前言 在v...
    99+
    2024-04-02
  • Vue实现组件间通信的几种方式(多种场景)
    目录1、Props 父 >>> 子  (Props)子 >>> 父 ($emit)2、Bus事件总线3、V...
    99+
    2024-04-02
  • vue组件通信有哪几种方式
    vue中组件通信的方式有:1.使用props/$emit实现父子组件通信;2.使用$refs/$parent/$children/$root实现父子组件通信;3.使用$attrs/$listener实现隔代组件通信;4.使用provide/...
    99+
    2024-04-02
  • Vue如何实现组件间通信方式
    这篇文章主要介绍了Vue如何实现组件间通信方式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。props父组件可以通过props向下传递数据给子组件静态的Props通过为子组件...
    99+
    2023-06-29
  • Vue组件间通信有哪几种方式
    这篇文章将为大家详细讲解有关Vue组件间通信有哪几种方式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Vue 组件间通信有哪几种方式?Vue 组件间通信是面试常考的知识点...
    99+
    2024-04-02
  • vue中有哪些实现组件通信的方式
    本篇文章给大家分享的是有关vue中有哪些实现组件通信的方式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。vue组件中关系说明:如上图所示, A...
    99+
    2024-04-02
  • Vue实现组件间通信的方式有哪些
    本篇内容主要讲解“Vue实现组件间通信的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue实现组件间通信的方式有哪些”吧!1、Props 父 >>> 子&...
    99+
    2023-06-25
  • Vue组件通信传递数据的三种方式
    目录Vue传值传递数据的三种方式方式一方式二方式三Vue传值 Vue.js是一个组件化的前端开发框架,支持父子组件之间的消息传递和数据通信。子组件向父组件传递消息的过程称为&ldqu...
    99+
    2023-05-17
    Vue组件通信几种方式 Vue组件通信实现
  • 深入了解Vue组件七种通信方式
    目录1.props/$emit简介代码实例2.v-slot简介代码实例3.$refs/ $parent/$children/$root简介代码实例4.$attrs/$listener...
    99+
    2024-04-02
  • Vue组件之间四种通信方式详解
    目录前言父子组件通信​父组件与子孙组件的通信​父组件获取子组件数据​无需考虑组件关系的通信​前言 vue 框架提供了前端开发组件的思想,可以通过组件来组合成一个完整的页面,都是随着组...
    99+
    2024-04-02
  • vue中实现组件间通信的方式有哪些
    这篇文章给大家介绍vue中实现组件间通信的方式有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。方法一、 props / $emit父组件A通过props的方式向子组件B传递,B t...
    99+
    2024-04-02
  • Vue组件间怎么通信?六种方式浅析
    Vue组件间怎么通信?下面本篇文章给大家介绍一下Vue组件通信的六种方式,希望对大家有所帮助!组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用。一般来说,组件可以有几种关系.针对...
    99+
    2023-05-14
    组件通信 前端 Vue.js
  • Vue组件的通信方式详解
    目录组件间通信的概念组件间通信解决了什么?组件间通信的分类组件间通信的方案props传递数据$emit 触发自定义事件refEventBus$parent 或 $root$attrs...
    99+
    2023-05-15
    Vue组件间的通信方式 Vue组件间通信
  • vue组件通信的多种方法详解
    目录1. 父传子2. 子传父3. 非父子组件传值4. vuex5. refs6. $children7. $parent8. provide & inject9. $attr...
    99+
    2024-04-02
  • 超实用vue中组件间通信的6种方式(最新推荐)
    目录前言1、 props / $emit2、ref / $refs3、eventBus事件总线($emit / $on)4、依赖注入(provide / inject)5、$pare...
    99+
    2022-11-13
    vue组件间通信 vue组件间通信方式
  • 怎样深入了解Vue组件七种通信方式
    怎样深入了解Vue组件七种通信方式,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。vue组件通信的方式,这是在面试中一个非常高频的问题,我刚开始找实习便经常遇到这个问题,当时只知...
    99+
    2023-06-22
  • vue通过子组件修改父组件prop的多种实现方式
    目录前言常用方式1. 通过父组件on监听子组件emit事件实现修改prop2. 通过父组件sync修饰符 + 子组件emit事件实现修改prop取巧方式3.通过data实现修改pro...
    99+
    2024-04-02
  • Vue组件间的通信方式详析
    目录前言组件之间通信的场景父子组件之间的通信父组件通过 prop 向子组件传递数据子组件通过自定义事件向父组件传递数据兄弟组件之间的通信状态提升隔代组件之间的通信attrs/attr...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作