首页 > 试题广场 >

说一说组件通信的方式?

[问答题]
推荐

得分点

父子通信、自定义属性、props、on、VueX

参考答案

标准回答

Vue组件的通信方式分为两大类,一类是父子组件通信,另一类是任何关系类型组件通信(父子、兄弟、非兄弟)

父子组件的通信方式:

  • 父给子传递数据,通过给子组件添加自定义属性,比如:<List :list="list"/>,list是父组件给子组件传递的数据。子获取父的数据,在子组件中使用props属性获取

  • 子给父传递数据,通过给子组件传递父组件的方法,子组件调用父组件的方法传递数据,比如:<List @delete="deleteHandler"/> ,deleteHandler就是父组件的函数,在子组件中通过this.$emit('方法名',参数),调用父组件的方法,并把数据传递到父组件。

  • props是只读,不可以被修改,所有被修改都会失效和被警告

任何关系类型组件通信(父子、兄弟、非兄弟)方式:

EventBus:

使用方法是创建一个新的Vue实例,需要通信的组件都引入该Vue实例,传递数据的组件使用` event.on('名称',方法)`接收数据。

VueX:

集中管理项目公共数据,Vuex 的状态存储是响应式的,当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。

加分回答

EventBus的优缺点,缺点vue是单页应用,如果你在某一个页面刷新了之后,与之相关的EventBus会被移除,这样就导致业务走不下去。同时如果页面中有反复操作的业务,EventBus在监听的时候就会触发很多次,需要好好处理EventBus在项目中的关系。在vue页面销毁时,同时移除EventBus事件监听。优点,解决了多层组件之间繁琐的事件传播,使用原理十分简单,代码量少。适合业简单,组件传递数据较少的项目,大型项目业务复杂的还是尽量使用VueX

延伸阅读

EventBus使用

创建Vue实例

import Vue from 'vue'
export default new Vue()

发送数据

import event from './event'
export default {
    data() {
        return {
            title: ''
        }
    },
    methods: {
        addTitle() {
            // 调用自定义事件
            event.$emit('onAddTitle', this.title)
        }
    }
}

接收数据

import event from './event'
export default {
    mounted() {
        // 绑定自定义事件
        event.$on('onAddTitle', this.addTitleHandler)
    },
    beforeDestroy() {
        // 及时销毁,否则可能造成内存泄露
        event.$off('onAddTitle', this.addTitleHandler)
    }
}
编辑于 2021-09-15 12:16:37 回复(0)

父子组件通信

  • props
  • vuex / pinia

子父组件通信

  • 父组件给子组件绑定事件, 子组件使用emit方法调用
  • vuex / pinia

兄弟组件通信

  • eventbus, vue3中使用第三方插件mitt
  • vuex / pinia

爷孙组件通信

  • provide / inject
  • vuex / pinia
发表于 2022-12-30 23:25:13 回复(0)
1、props:主要是实现父组件向子组件传递数据,具体是在父组件中的子组件标签上用:data传递数据,在父组件中用props接收数据;props也可以实现子组件向父组件通信,就是传递过去一个函数,通过函数带参数的方式传递给父组件,但该方法不常用。
2、自定义事件:实现子组件向父组件传递数据。在父组件中,为子组件绑定一个自定义事件,可以用@也可以用$on,并且回调函数存在于父组件中。在子组件中用$emit触发自定义事件,$emit第一个参数是事件名,第二个参数是要传递的参数。
3、插槽:用来实现父组件向子组件通信。父组件可以向子组件指定位置插入html结构。具体是在父组件中使用Category包裹住要传递的结构,在子组件中使用slot做占位。
4、vuex:可以实现任意组件间的通信。数据会存放在state里面,可以在actions中发送ajax请求数据,在mutations中可以对数据进行处理。所有的组件都可以通过mapState拿到state中的数据。
5、全局事件总线:可以实现任意组件间的通信。$bus。在main.js入口函数中,实例化vue时,在beforeCreate中注册全局事件总线$bus,那所有的组件实例对象都可以访问到$bus里的数据。
6、消息订阅与发布:也可以实现任意组件间的通信。
发表于 2022-09-22 16:43:30 回复(0)
react的通信
父子组件通信 props,useImperativeHandle/useRef
兄弟组件通信,在父组件定义同样的方法
普通组件通信,利用redux或者是一些自定义的属性,比如sessionStorage

发表于 2022-04-18 10:14:43 回复(0)
1.props/$emit
2.全局事件总线
3.vuex
发表于 2021-10-20 18:27:30 回复(0)