父传子
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 表明 当前开发中 需要这个方法的时候,大概率是代码
出现问题了,应该修改代码