iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >超详细的vue组件间通信总结
  • 479
分享到

超详细的vue组件间通信总结

2024-04-02 19:04:59 479人浏览 独家记忆
摘要

目录前言一、props、$emit单向数据流二、$parent、$children三、$attrs、$listeners四、provide、inject五、eventBus(事件总线

前言

组件通信在我们平时开发过程中,特别是在vue和在React中,有着举足轻重的地位。本篇将总结在vue中,组件之间通信的几种方式:

  • props、$emit
  • $parent、$children
  • $attrs、$listeners
  • provide、inject
  • eventBus
  • vuex
  • 本地存储

一、props、$emit单向数据流

father.vue:


<template>
  <div>
    <div>我是父亲:<input type="button" value="父亲" /> 数字为: {{num}}</div>
    <son :num="num" @change="change"></son>
  </div>
</template>

<script>
import son from "./son.vue";
export default {
  name: "Father",
  components: {
    son,
  },
  data() {
    return {
      num: 1,
    };
  },
  methods:{
    change(val){
      this.num = val
    }
  }
};
</script>

son.vue:


<template>
  <div>我是儿子:<input type="button" value="儿子" @click="change"/>数字为:{{num}}</div>
</template>

<script>
export default {
  name: "App",
  components: {},
  props: {
    num: {
      default: 0,
    },
  },
  created() {},
  methods: {
    change(){
      // this.num = 2  props通信是单向数据流,在这直接修改父组件传过来的num将会报错    // 可以用$emit触发change事件,father组件绑定change事件    this.$emit('change', 2)
    }
  },
};
</script>

对于上面的场景:子组件的change事件只是为了修改父组件中某一个值,还可以有以下几种写法:

1.父组件绑定给子组件的事件使用箭头函数


father:
<son :num="num" @change="val => num = val"></son>

son:
this.$emit('change', 2)

2.update:num和.sync


father:

<son :num.sync="num"></son>

son:

this.$emit('update:num', 2)//update是规定的写法,不可更换

3.v-model

先修改props和绑定的事件:


father:<son :value="num" @input="val => num = val"></son>son:this.$emit('input', 2) 
可用v-model简写:<son v-model="num"></son>

二、$parent、$children

$parent、$children可直接在父子组件中调用各自的方法以及修改数据

子组件中直接:this.$parent.num = 2

父组件中$children是个数组,因此具体是哪个子组件不太直观,可以用$refs来操作子组件

vue官方并不推荐使用这种通信方式:节制地使用$parent$children- 它们的主要目的是作为访问组件的应急方法,更推荐用 props 和 events 实现父子组件通信。

三、$attrs、$listeners

$attrs可以拿到父组件传过来的属性:


<div>我是儿子:<input type="button" value="儿子" @click="change"/>数字为:{{$attrs}}</div>

dom节点:

$attrs会直接将传过来的属性放到对应的标签上,反观props就不会。如果想去掉标签中的这些属性,可以用inheritAttrs:

值得注意的是:props的优先级大于$attrs,即当props存在的时候,$attrs为空对象:

$attrs常用于跨多级组件传递属性,比如祖孙组件,用父组件做中转:

father:


<son v-bind="$attrs"></son>

$attrs用于属性跨级传递,方法跨级传递则用$listeners。

grandFather.vue:


<template>
  <div>
    <div>我是祖父: 数字为:{{nums}}</div>
    <father :nums="nums" @up="up" @down="down"></father>
  </div>
</template>

<script>
import father from "./father.vue";
export default {
  name: "App",
  components: {
    father,
  },
  data(){
    return {
      nums:0
    }
  },
  methods: {
    up() {
      alert('up')
    },  down() {   alert('down')  },
  },
};
</script>

father.vue:


<son v-bind="$attrs" v-on="$listeners"></son>

son.vue:


<div>我是儿子:<input type="button" value="儿子" @click="$listeners.up"/></div>

四、provide、inject

这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在其上下游关系成立的时间里始终生效

provide选项应该是一个对象或返回一个对象的函数。

inject选项应该是一个字符串数组或一个对象。

App:


...

export default {
  provide(){
    return {vm: this}
  },

...

son:


...

export default {
  inject: ['vm'], data(){}, mounted(){  console.log(this.vm) }

...

注意:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的 property 还是可响应的。

   inject注入中的值会沿着组件向上查找,遵从"就近原则"。

   provide 和 inject中的数据流是双向的。

五、eventBus(事件总线)

eventBus通过发布订阅全局事件,供其他组件使用。

在main.js中:


Vue.prototype.$bus = new Vue();

parent.vue:


<template>
  <div>
    <son1></son1>
    <son2></son2>
  </div>
</template>

<script>
import son1 from './son1.vue'
import son2 from './son2.vue'
export default {
  name: 'parent',
  components: {
    son1,
    son2
  },
  created(){
     this.$bus.$on('busEvent',(v)=>{
      console.log(v);
    })
  },
  beforeDestroy(){
    this.$bus.off('busEvent')
  }
}
</script>

son1和son2中的mounted:


son1:mounted(){
  this.$bus.$emit('busEvent','son1哈哈')
}son2:mounted(){  this.$bus.$emit('busEvent', 'son2嘻嘻')}

打印结果:

使用eventBus有三点需要注意,1.$bus.on应该在created钩子内使用,如果在mounted使用,它可能接收不到其他组件来自created钩子内发出的事件;

               2.$bus.emit应该在mounted中使用,等待created中的$bus.on事件绑定完成;

               3.发布订阅的事件在beforeDestory钩子里需要使用$bus.off解除,组件销毁后没必要一直监听。

六、vuex

借助vuex的状态管理来实现组件通信,vuex适用于较为复杂的项目,频繁的数据共享且数据量比较大。

store/index.js:


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

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    isLogin: false
  },
  mutations: {
    loginState (state, isLogin) {
      state.isLogin = isLogin
    }
  }
})

export default store

App.vue:


created(){
  this.$store.commit('loginState',true)// 设置登录状态为true
},

son.vue:


<template>
  <div>我是儿子:<input type="button" value="儿子" />登录状态:{{isLogin}}</div>
</template>

<script>
import {mapState} from 'vuex';
export default {
  name: "son",
  computed:{
    ...mapState(['isLogin'])
  }
};
</script>

七、localstorage

localstorage是浏览器的本地存储,将会长期存储在浏览器中,非常庞大的数据不建议用此方式。

App.vue


created(){
  localStorage.setItem('isLogin', true)
},

son.vue:


computed:{
  isLogin(){
    return localStorage.getItem('isLogin')
  }
}

常见的组件通信方式基本就是这些啦,有什么遗漏或不足的,欢迎评论区留言!

总结

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

--结束END--

本文标题: 超详细的vue组件间通信总结

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 超详细的vue组件间通信总结
    目录前言一、props、$emit单向数据流二、$parent、$children三、$attrs、$listeners四、provide、inject五、eventBus(事件总线...
    99+
    2024-04-02
  • Vue组件之间的通信方式详细讲解
    目录前言一、父级传数据给子级1、传输固定的具体数据2、动态语法3、子组件调用父组件二、子级传数据给父级1、使用自定义事件2、$refs的使用3、同级别组价以及任意组件之间的数据传递前...
    99+
    2024-04-02
  • Vue组件通信方法案例总结
    目录一、父组件向子组件传值(props)二、子组件向父组件传值($emit)三、兄弟组件传值(EventBus)1.初始化(newVue())2.发送事件($emit())3.接收事...
    99+
    2024-04-02
  • Vue组件间的通信方式详析
    目录前言组件之间通信的场景父子组件之间的通信父组件通过 prop 向子组件传递数据子组件通过自定义事件向父组件传递数据兄弟组件之间的通信状态提升隔代组件之间的通信attrs/attr...
    99+
    2024-04-02
  • vue组件间的通信,子组件向父组件传值的方式汇总
    目录一、子组件通过this.$emit()的方式将值传递给父组件二、通过vuex来传递组件间的数据三、通过中央总线来传递组件间的数据四、通过修改父组件传过来的对象属性五、父组件使用子...
    99+
    2023-03-20
    vue组件通信 vue子组件 vue父组件传值
  • Vue组件间通信方式全面汇总介绍
    目录一、组件间通信最基本方式-props二、组件间通信-vue自定义事件三、组件间通信-事件总线四、组件间通信-v-model五、组件间通信-sync属性修饰符六、组件间通信-$at...
    99+
    2023-05-16
    Vue通信方式 Vue组件通信方式
  • Vue父子组件通信全面详细介绍
    目录1.Vue父子组件通信方式2.不同文件间的通信方式1 .父组件vue文件和子组件vue文件2 .父组件jsx文件和子组件vue文件3 .父组件vue文件和子组件jsx文件4 .父...
    99+
    2022-11-13
    vue的父子组件通信 vue父子组件通信例子
  • Vue组件之间四种通信方式详解
    目录前言父子组件通信​父组件与子孙组件的通信​父组件获取子组件数据​无需考虑组件关系的通信​前言 vue 框架提供了前端开发组件的思想,可以通过组件来组合成一个完整的页面,都是随着组...
    99+
    2024-04-02
  • Vue3的10种组件通信方式总结
    目录引言Propsemitsexpose / refNon-Props单个根元素的情况多个元素的情况v-model单值的情况多个 v-model 绑定v-model 修饰符插槽 sl...
    99+
    2024-04-02
  • VUE组件传参超详细讲解
    目录Vue.cli 中怎样使用自定义的组件Vue 组件如何进行传值的父组件向子组件传递数据子组件向父组件传递数据非父子组件之间传递数据父传子例子子传父例子Vue组件data为什么必须...
    99+
    2024-04-02
  • vue的组件通讯方法总结大全
    目录1.通过属性传值props2.修饰符 .sync3.使用.sync 向子组件传递 多个props:4.通过 ref 注册子组件引用5.通过$parent获取父组件实例的...
    99+
    2024-04-02
  • Java基础之数组超详细知识总结
    目录一、一维数组二、二维数组三、总结一、一维数组 1、Java语言中的数组是一种 引用数据类型。不属于基本数据类型。数组的父类是 Object。 2、数组实际上是一个容器,可以同时容...
    99+
    2024-04-02
  • Vue非父子组件之间的通信方式详解
    目录非父子组件的通信1.Provide和Inject1.1基本使用1.2处理响应式数据(了解)2.全局事件总线总结非父子组件的通信 此篇讲解的是, 在学习状态管理之前, 非父子间通信...
    99+
    2024-04-02
  • Vue实现组件间通信的示例
    这篇文章主要介绍了Vue实现组件间通信的示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 父子间通信最常见的就是父子之间的通信,通信是双向的数据传递。1.1 父组件 -...
    99+
    2023-06-15
  • Vue组件的通信方式详解
    目录组件间通信的概念组件间通信解决了什么?组件间通信的分类组件间通信的方案props传递数据$emit 触发自定义事件refEventBus$parent 或 $root$attrs...
    99+
    2023-05-15
    Vue组件间的通信方式 Vue组件间通信
  • Vue如何实现组件间通信
    目录1. 父子间通信1.1 父组件 --> 儿子组件1.2 儿子组件 --> 父组件2. 爷孙间通信3. 任意组件间通信3.1 EventBus3.2 Vuex1. 父子...
    99+
    2024-04-02
  • vue组件间通信全面讲解
    目录前言组件介绍一、父传子1. 父组件通过 props 传递数据给子组件2. 定义props的类型和默认值二、子传父子组件通过 $emit 传递数据给父组件三、非父子组件间数据传递1...
    99+
    2024-04-02
  • vue组件间通信如何实现
    本篇内容主要讲解“vue组件间通信如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue组件间通信如何实现”吧!父组件传子组件父传子方法(一) 属性传递 props//子组件&l...
    99+
    2023-07-04
  • vue组件间如何进行通信
    本篇内容介绍了“vue组件间如何进行通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!vue是数据驱动视图更新的框架, 我们平时开发,都会把...
    99+
    2023-06-21
  • C#读写xml文件方法总结(超详细!)
    目录C#写入xml文件1、XmlDocument2、DataSet对象里的值来生成XML文件3、利用XmlSerializer来将类的属性值转换为XML文件的元素值。示例:写入xml...
    99+
    2023-02-21
    c#读写xml文件 c# 读xml c#读取xml文件教程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作