1. 路由导航守卫扩展
我理解的导航守卫 就是一座房子的保安 只有保安允许了才能访问页面
之前说三种六个 还有一个用的不是很多的全局守卫 叫做全局解析守卫 beforeResolve
导航守卫一共有三种
全局的守卫 守卫所有的页面
beforeEach 路由前置守卫
beforeResolve 路由解析之前
afterEach 路由离开
全局守卫 beforeEach 和 beforeResolve
他们两个都会在路由跳转前就执行 参数都是 to from next
他们两个的区别 执行的时机不一样 beforeEach 是在路由规则被循环之前执行
beforResolve 是在组件被解析之后调用 beforeEach 要比 beforResolve 先执行
组件守卫 守卫单个组件
beforeRouteEnter 路由进入
beforeRouteUpdate 路由更新
beforeRouteLeave 路由离开
独享守卫 守卫单个页面
beforeEnter 路由进入之前
三种守卫全局 组件 独享守卫的区别:
- 作用范围不同 全局作用于所有页面 组件作用于单个组件 独享也是守卫单个页面
- 代码写的位置不一样 全局守卫写在 router/index.js 中 组件守卫写在组件里 跟 data 同级 独享守卫写在路由规则里
- 执行顺序有区别 执行的顺序要记下来
beforeEach 前置守卫
beforeEnter 独享守卫
beforeRouteEnter 组件守卫
beforeResolve 解析守卫
afterEach 路由后置守卫
2.组件传值的八种方式
- 父传子
- 首先在使用子组件的标签上 通过自定义属性传递变量 在子组件中 通过 props 接受
在接收的时候有两种接收方式 数组形式 和 对象形式 对象形式可以规定传来的变量的数据类型(type)默认值(default)以及是否必填(required)
- 子传父
首先在使用子组件的标签上定义一个自定义事件 在子组件里通过 this.$emit 去调用这个自定义事件 $emit 方法的第一个参数是自定义事件的名字 第二个参数是就是子组件要传递给父组件的变量 最后在父组件接收使用就可以了
- 兄弟组件
- 利用中央事件总线 eventbus
在 main.js 中 把一个空的 vue 实例挂载在 vue 的原型上起名叫 b u s 传 数 据 的 时 候 用 t h i s . bus 传数据的时候用this. bus传数据的时候用this.bus. e m i t 传 在 要 接 受 数 据 的 子 组 件 在 c r e a t e d 钩 子 函 数 中 用 emit传 在要接受数据的子组件 在 created钩子函数中 用 emit传在要接受数据的子组件在created钩子函数中用on 方法接收
-
利用 vuex 进行组件通信 把公共的数据存在 vuex 里就可以实现组件之间都能使用这个数据了
-
其实 v-model 也能实现组件通信 因为 v-model 就是 :value 和 @input 事件的合写 如果在一个子组件上使用 v-model 也能实现父子组件之间的通信
-
a t t r + attr+ attr+listener
如果父组件 A 下面有子组件 B 子组件 B 下面又有子组件 C 如果 a 组件的变量和方法想要传给组件 C 的时候 就用到这个方法 适用于多级组件传值
在 B 组件中给 C 组件绑定 v-bind=“ a t t r s " v − o n = " attrs" v-on=" attrs"v−on="listeners” 然后在 C 组件中就可以直接使用 a 传来的属性和方法了
(简单来说: a t t r s 与 attrs与 attrs与listeners 是两个对象, a t t r s 里 存 放 的 是 父 组 件 中 绑 定 的 非 P r o p s 属 性 , attrs 里存放的是父组件中绑定的非 Props 属性, attrs里存放的是父组件中绑定的非Props属性,listeners 里存放的是父组件中绑定的非原生事件。)