vue 组件之间的通讯

120 阅读2分钟

父传子

    1.  在父组件 调用 子组件 的 时候,给 子组件绑定一些数据(信息)
        绑定的方式 其实就是给 子组件的 这个 标签 添加一些自定义属性
    2.  在子组件中通过 props 接收
        props 可以是一个数组,也可以是一个对象,推荐数组
    注意:
        在子组件不允许修改父组件传递过来的数据,也就是说,子组件通过props 接收的数据,能用
        但是不允许被修改
        因为 vue 中的 数据遵循的是单向数据流,也就是说,数据能从父组件 流到 子组件,但是
        子组件的数据不能 流向 父组件, 同时也不能修改

子传父

    子传父 因为单向数据流的原因,我们只能通过事件传递
    1. 子组件在某一个时机,通知父组件,触发一个事件
       在 子组件 触发事件的时候 通知
       在事件处理函数中 用 this.$emit('父组件调用的事件', 事件处理函数的参数)
       
    2. 在 父组件使用 子组件 的时候, 给子组件绑定一个 自定义事件,一定记得使用 @
        当子组件通知我们触发自定义事件的时候,我们在父组件内 有一个对应的函数会触发
        这个函数的参数就是子组件 通知父组件时 传递的数据

祖孙级通信

    1. 在 祖先级组件中 利用 provide 向所有的后代组件 暴露一些数据
        可以是普通字符串,也可以是 data 中的数据,也就是 methods 中的方法
        provide 它的值是一个 函数
            函数内部需要返回一个对象
    2.在需要接收数据的 组件, 利用 inject 接收到 祖先级组件暴露的数据
    
    

属性透传

    1.在祖先级中通过 父传子的方式 给子组件添加一些属性或者方法
    2.在子组件中,如果有需要使用,那么直接通过 props 接收使用
        如果不需要使用,可以通过 给 子组件 添加一个
        v-bind="$attrs"
        将我们当前子组件接收到的属性和方法,透传给孙子组件
        
        传递过去的属性,名字不变
        传递过去的方法,名字会变成 on + 方法名

兄弟级通讯

    一般需要使用 状态管理 工具 完成
        最常用的方案 (vuex/pinia)
    在 vue2 的时候,还有一个通信方案, 叫做 eventBus, 也能用来实现兄弟级通讯
    但是 在 vue3 的时候, vue 官方将这个方案 删除了
    
    导入 import mitt from 'mitt'
         const eventBus = mitt()
         
         在一个 兄弟级组件中的 事件处理函数内 
             eventBus.emit('通讯频道','发送的数据')
         在另一个 兄弟级组件中 事件处理函数 中 接收
             eventBus.on('和上一个频道一致',处理函数)
    

ref 属性

    vue 中通过给标签绑定一个 ref 属性,可以帮助我们 便捷的获取对应标签
    将来我们可以通过 this.$refs 获取到标签
    
    组件也是标签,所以也可以通过 ref 获取
    但是获取到的是组件的实例对象,内部包含这个组件的方法和数据

生命周期

    组件从创建到挂载,到数据更新,一直到最后的销毁的一个 完整过程
    
    生命周期一共分为 四大阶段,分别:
        创建阶段:
            创建前
                beforeCreate() { 组件创建前执行 }
            创建后
                created() { 组件创建后执行 }
        挂载阶段
            挂载前
                beforeMount() { 当前组件挂载前执行,此时的状态与创建后没有区别 }
            挂载后
                mounted() { 当前组件挂载后执行,此时页面的所有内容已经全部加载完 }
        更新阶段
            数据更新前
                beforeUpdate() { 当前组件数据更新前 }
            数据更新后
                updated() { 当前组件的数据更新后 }
        卸载阶段
            卸载前
                beforeUnmount() { 当前组件卸载前会执行 }
            卸载后
                unmounted() { 当前组件卸载后执行 }
        

强制更新页面

    使用一个当前 data 中没有显示声明的一个变量
    然后在函数中 对这个变量进行修改,此时 vue 是无法检测到我们的变量发生变化
    
    在函数内 this.$forceUpdate() 
    调用之后能够强制更新页面, 但是 vue 表明 当前开发中 需要这个方法的时候,大概率是代码
    出现问题了,应该修改代码