返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue如何解决兄弟组件之间传值问题
  • 178
分享到

Vue如何解决兄弟组件之间传值问题

2024-04-02 19:04:59 178人浏览 八月长安
摘要

目录解决兄弟组件之间传值问题bus可以通过两种方式来实现各类组件间传值方法(父子、兄弟、页级)父子关系组件兄弟关系组件页级关系组件解决兄弟组件之间传值问题 Vue中 父组件向子组件传

解决兄弟组件之间传值问题

Vue中 父组件向子组件传递参数时,可以通过prop来传递参数,prop可以是数组形式,也可以是对象格式,子向父组件传递参数时,通过$emit来传递,$emit('方法名', 传参),来实现子组件和父组件数据交互,但是在父组件中,有好多个子组件,这些子组件怎么样来进行数据通讯呢?

有的同学会立马想到 vuex ,答案是:可以的,但是会不会大材小用?在项目中,只是个别组件需要用到通讯,我们是不会优先考虑vuex来解决的。

下面我们可以使用一个特别好用的方法来实现兄弟组件之间数据通讯

bus.js 顾名思义 巴士,所有人都可以上车,不管你在哪里,不管你是什么组件,我都可以开车过去接你。

bus可以通过两种方式来实现

1. 通过创建.js文件局部方式来实现,在需要用到的组件中引入,然后调用它即可

在项目的utils文件中创建一个js文件,在正常的项目种,会用utils来存放哪些共用的js文件,这些js文件是一些常用的方法或例如这个bus 

// bus.js
import Vue from 'vue';
export default new Vue();

接下来,哪个组件需要发车你就在哪里import给它建立一个发车点

// 在 vue组件中引入
import bus from "../../utils/bus";

然后这里我们在vue的实例中的methods函数中定义一个方法来触发这个bus发车

methods: {
      busFun(data) {
        // 通过 $emit 来触发方法,参数1 是定义方法名,参数2 是你要发送的数据
        bus.$emit('name', data)
      },
    }

这里千万要注意了,若你使用多个bus 那么参数1命名千万别重复,否则其他组件会出现无故上车的情况,这个bus中可以给无数个组件使用,但是命名不能重复,除非你创建多个bus。

接下来我们就看看这辆巴士有哪个组件要上车。

同样,如果其他组件要上车,我们必须要在这个组件中设立一个车站,不然巴士不知道要在哪里接这个组件。

// 这个组件需要上车,我们先设立一个车站
import bus from "../../utils/bus";

设立车站后,我们就需要通过 bus.$on来触发,也就是上车的技能

 created() {
      bus.$on('name', (data) => {
        console.log(data, '上车成功');
      })
    },
    // 打卡
    beforeDestroy() {
      bus.$off('name');
    },

这里会有同学会疑惑,为什么上车后需要打卡???

我们先说从上往下说吧,首先我们必须要在 vue 的created钩子函数中来触发这个bus,在页面还没加载的时候我们先触发它然后拿到数据,在created中执行,我们可以避免很多坑,例如触发bus无法拿到数据等问题(想了解的同学去问度娘,这里就不说明了)。

然后我们每次触发这个bus的时候,我们必须在整个生命周期走完的时候将这个bus给移除掉。

简单粗暴的说,就是我们每个组件上车的时候,我们必须要给它打卡掉,让后面的bus知道这个组件已经上车了,不需要在这里等待,接到就开走,头都不回的那种。

执行beforeDestroy来销毁这个bus方法,是避免方法“冗余”,若不清除这个方法,那将会出现多个bus触发,每次都会将这辆bus停留在这个vue的生命周期中,打开控制台你会发现有好多辆bus在这里停留,因为我们每次触发bus时,就会开一辆巴士出来,而不是这辆巴士一直重复开的原因。

2. 接下来我们就说一下第二种方式

// 我们在main.js中用常量创建一个bus,然后将它放入Vue实例的原型对象中。
const bus = new Vue()
Vue.prototype.$bus = bus;

然后我们就可以在全局 通过this.$bus来开巴士了(#滑稽)。接下来只要开稳就可以为所欲为了。

 created() {
      this.$bus.$on('name', (data) => {
        console.log(data, '上车成功');
      })
    },
    // 打卡
    beforeDestroy() {
      this.$bus.$off('name');
    },

最后别忘了给乘客打卡哦!

各类组件间传值方法(父子、兄弟、页级)

熟悉vue各类关系的组件之间传值方法会令开发更加得心应手,下面将对父子、兄弟、页级组件之间的传值作浅谈。

父子关系组件

- 父向子组件传值

父组件向子组件传值通常是利用props属性。首先,在子组件里定义一个props值用来接收父组件数据;然后调用子组件并v-bind绑定这个props值 = 父组件的data值。

父组件代码:

<template>
  <div class="home">
    <HelloWorld :newMsg="msg" /> 
    //绑定子组件newMsg(props值) = 父组件msg(data值)
  </div>
</template>
<script>
import HelloWorld from "@/components/HelloWorld.vue";
export default {
  name: "Home",
  data(){
    return{msg:'Welcome to vue.js'} //父组件数据msg
  },
  components: {HelloWorld}
};
</script>

子组件代码:

<template>
  <div>
    <h1>{{ newMsg }}</h1>  //直接调用newMsg,显示“Welcome to Vue.js”
  </div>
</template>
<script>
export default {
  name: "HelloWorld",
  props: {newMsg: String}  //为子组件定义newMsg(props值)接收父组件msg
  //或者props:['newMsg']
};
</script>

- 子向父组件传值

子组件向父组件传值有两种方式:

1. 利用$emit()方法。 首先在子组件中用$emit()向上传递一个自定义事件并附带想要传递的数据;然后在父组件v-on监听这个自定义事件并自动接收到数据;最后在响应该事件的方法中进行数据操作。

子组件代码:

<script>
export default {
  name: "HelloWorld",
  data() {
    return {msg:"Welcome to Vue"} //data值,即将向上传递的值
  },
  created(){
    this.$emit('change',this.msg) //向上传递自定义事件change和data值。这里我调用created生命周期函数触发$emit()
  }
};
</script>

父组件代码:

<template>
  <div class="home">
    <HelloWorld @change="handle" /> //监听到子组件传递来的事件并响应handle方法
    <span>{{newMsg}}</span>  //直接调用newMsg,显示“Welcome to Vue”
  </div>
</template>
<script>
import HelloWorld from "@/components/HelloWorld.vue";
export default {
  name: "Home",
  data() {
    return {newMsg:""}
  },
  methods:{
    handle(msg){           //定义handle方法,将自动接收到的msg值给了自己的newMsg
      this.newMsg = msg
    }
  },
  components: {HelloWorld}
};
</script>

2.利用ref属性。 ref是vue提供的内部属性,它其实相当于类似"id""class"的标识。首先在子组件上定义ref值(例:ref="son");然后在父组件中用this.\$refs.son即可获取到son这个ref的组件,进行操作。

子组件代码:

<script>
export default {
  name: "HelloWorld",
  data() {
    return {msg:"Welcome to Vue"}  //即将向父传递的data值
  }
};
</script>

父组件代码:

<template>
  <div class="home">
    <HelloWorld ref="son" />  //在子组件上定义一个ref 名为"son"
  </div>
</template>
<script>
import HelloWorld from "@/components/HelloWorld.vue";
export default {
  name: "Home",
  mounted(){
    console.log(this.$refs.son.msg)  //获取到ref名为"son"的子组件内msg数据,在控制台显示“Welcome to Vue”
  },
  components:{HelloWorld}
};
</script>

兄弟关系组件

兄弟组件间的传值方式我称为 “总线转送” 。原理很简单,利用父组件作为总线去转送数据。首先,用上述讲到的ref属性或$emit()将组件A的数据向上传递给父组件;再由父组件通过props属性向下传值到组件B。

组件A代码:

<template>
  <div>click me</div>
</template>
<script>
export default {
  name: "HelloWorld",
  data() {
    return {helloMsg:"Welcome to Vue"} //即将传送的数据helloMsg
  }
};
</script>

组件B代码:

<template>
  <div>
    {{hiMsg}}  //直接调用hiMsg,显示“Welcome to Vue”
  </div>
</template>
<script>
export default {
  name: "Hi",
  props:{hiMsg:String} //用来接收父组件传值的props属性hiMsg
};
</script>

父组件代码:

<template>
  <div class="home">
    <HelloWorld ref="son" @click.native="change"></HelloWorld> //定义ref属性接收组件A传来的数据;点击组件A触发change()
    <Hi :hiMsg="msg"></Hi>  //绑定组件B的hiMsg=msg,将数据转发给组件B
  </div>
</template>
<script>
import HelloWorld from "@/components/HelloWorld.vue";
import Hi from "@/components/Hi.vue";
export default {
  name: "Home",
  data(){
    return{ msg: "" }
  },
  methods:{
    change(){
      return this.msg = this.$refs.son.helloMsg //将组件A传来的helloMsg赋予this.msg
    }
  },
  components:{HelloWorld, Hi}
};
</script>

页级关系组件

在vuecli3.0以后,项目结构对组件级别作了明确的区别:入口组件(App) - 页级组件(View) - 零件组件(Component)。一般在开发中我们也会尽量按照这种结构去划分模块,但页级组件没有父组件,如果说页级组件之间需要传值,那就不能用“总线转送”的方法了。

vuex:这是官方提供的一个插件,可称为“状态管理仓库”,用来管理项目中需要跨页共享反复调用的状态(状态你可以理解成就是数据、变量、方法)。

vuex的存放仓库为Store,内部结构可分五大块:

  • state:状态库,寄放基础状态。
  • mutations:同步方法,可理解成相当于组件内的computed属性,接收state进行改装。
  • actions:异步方法,只针对mutations,接收并改装。
  • getters:过滤器,对state调用前进行改装、派生并返回数据。
  • modules:模块,在复杂项目中用modules处理Store,使分工更清晰。

vuex令开发中数据共享操作更得心应手,还需要大家到官方文档认真学习。以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。 

--结束END--

本文标题: Vue如何解决兄弟组件之间传值问题

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

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

猜你喜欢
  • Vue如何解决兄弟组件之间传值问题
    目录解决兄弟组件之间传值问题bus可以通过两种方式来实现各类组件间传值方法(父子、兄弟、页级)父子关系组件兄弟关系组件页级关系组件解决兄弟组件之间传值问题 vue中 父组件向子组件传...
    99+
    2024-04-02
  • 如何理解vue父子传值,兄弟传值,子父传值
    本篇内容主要讲解“如何理解vue父子传值,兄弟传值,子父传值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解vue父子传值,兄弟传值,子父传值”吧!一、父组件向子组件传值1.父组件.vue...
    99+
    2023-06-25
  • vue兄弟组件传值的方法有哪些
    这篇文章主要介绍了vue兄弟组件传值的方法有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。五种方法为:1、父组件向子组件进行传值;2、子组件向父组件进行传值;3、父组件中...
    99+
    2023-06-15
  • Vue3兄弟组件传值之mitt的超详细讲解
    目录前言比起 Vue 实例上的 EventBus,mitt.js 好在哪里呢?项目中安装mitt使用方式一:在原型中声明使用方式二:在组件中引用总结前言 Vue2.x 使用 ...
    99+
    2024-04-02
  • VUE中怎么实现兄弟组件传值操作
    VUE中怎么实现兄弟组件传值操作,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、兄弟之间传递数据需要借助于事件车,通过事件车的方式传递数据2...
    99+
    2024-04-02
  • vue如何实现兄弟组件的数据传递
    本篇内容介绍了“vue如何实现兄弟组件的数据传递”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在main.js里面设置data{eventH...
    99+
    2023-07-04
  • vue中兄弟组件传值的两种方式小结
    目录一. bus总线传值的使用二. 使用常规的传值:(子传父,父再传子)总结本demo主要是为了演示vue项目中兄弟组件之间的传值,这里我演示了两种方式:a. bus总线传值;b. ...
    99+
    2022-11-13
    vue兄弟组件传值 vue兄弟组件 vue组件传值
  • Vue3兄弟组件传值之mitt怎么安装使用
    本篇内容介绍了“Vue3兄弟组件传值之mitt怎么安装使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!比起 Vue 实例上的 EventB...
    99+
    2023-07-02
  • Vue中父子组件间传值问题怎么解决
    本篇内容介绍了“Vue中父子组件间传值问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一.父组件向子组件传值父组件向子组件传值会用...
    99+
    2023-07-05
  • vue实现兄弟组件之间跳转指定tab标签页
    目录兄弟组件之间如何跳转指定tab标签页场景vue.js实现tab页面的跳转    tab标签tab标签对应的展示的内容vue实例中对应的数据...
    99+
    2024-04-02
  • vue兄弟组件间怎么进行通信?方法详解
    Vue.js 是一款渐进式 JavaScript 框架,它的响应式系统和组件化架构使得它在 Web 开发中越来越受欢迎。近来,很多开发者在使用 Vue.js 时遇到了兄弟组件间通信的问题,本文将介绍如何使用 Vue.js 的兄弟组件方法解决...
    99+
    2023-05-14
  • vue3子组件之间相互传值问题怎么解决
    这篇文章主要介绍“vue3子组件之间相互传值问题怎么解决”,在日常操作中,相信很多人在vue3子组件之间相互传值问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue3子组件之间相互传值问题怎么解决...
    99+
    2023-07-05
  • vue父子组件间如何传值
    本文小编为大家详细介绍“vue父子组件间如何传值”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue父子组件间如何传值”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。父组件传递方法首先,在Vue中父组件向子组件传...
    99+
    2023-07-06
  • 如何解决vue子组件修改父组件传来的props值报错问题
    这篇文章主要介绍如何解决vue子组件修改父组件传来的props值报错问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!vue不推荐直接在子组件中修改父组件传来的props的值,会报错...
    99+
    2024-04-02
  • vue3实战-子组件之间相互传值问题
    目录vue3子组件之间相互传值vue不同组件之间相互传值总结vue3子组件之间相互传值 1、引用第三方库mitt npm install mitt 2、在项目src文件夹下创建uti...
    99+
    2023-03-19
    vue3组件传值 子组件之间相互传值 vue3子组件相互传值
  • 一文浅析Vue中父子组件间传值问题
    vue父子组件之间怎么传值?下面本篇文章带大家了解一下Vue中父组件以及子组件传值问题,希望对大家有所帮助!前言:在一些页面中不单单的纯纯的一个vue文件,vue讲究组件化开发,但是一般的肯定会产生交互事件,今天了解了这个传值,特此的来记录...
    99+
    2023-05-14
    组件传值 vue组件传值 Vue
  • 详解vue组件之间相互传值的方式
    目录概述一、父组件向子组件传值二、子组件向父组件传值1.子组件绑定一个事件,通过 this.$emit() 来触发2.通过 callback 函数3. 通过 $parent / $c...
    99+
    2024-04-02
  • 通过实例讲解vue组件之间的传值
    目录前言1.父组件向子组件进行传值2.子组件向父组件进行传值3.非父子组件之间的传值 总结前言 目前在做vue的项目,用到了子组件依赖其父组件的数据,进行子组件的相关请求和...
    99+
    2024-04-02
  • vue组件如何传值
    这篇文章主要介绍“vue组件如何传值”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue组件如何传值”文章能帮助大家解决问题。传值方法:1、利用props实现父传子;2、子传父,需要自定义事件,在子...
    99+
    2023-07-04
  • vue父子模板传值问题如何解决
    这篇文章主要讲解了“vue父子模板传值问题如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue父子模板传值问题如何解决”吧!具体代码如下:<!DOCTYPE html...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作