组件通信
父组件 => 子组件
属性 props
1 | // child |
特性 $attrs
1 | // child 并未在 props 中声明 foo |
$attrs
包含了父作用域中不作为prop
被传入的特性 (class
和style
除外),可以通过v-bind="$attrs"
在内部组件中获取所有这些特性。
常与
inheritAttrs
配合使用,通过将inheritAttrs
设置为false
可使组件的根元素不继承传入的特性(class
和style
除外)。
引用 refs
1 | // parent |
子元素 $children
1 | // parent |
$children
是当前实例的直接子组件,但并不保证顺序,也不是响应式的。
子组件 => 父组件
自定义事件
1 | // child |
由谁派发的事件则由谁监听。
兄弟组件之间
通过共同的祖辈组件搭桥:$parent
或 $root
。
1 | // brother1 |
祖先和后代组件之间
provide
/ inject
1 | // ancestor |
通过
provide
和inject
绑定的值并不是可响应的,然而,如果传入了一个可监听的对象,那么其对象的属性还是可响应的。
任意两个组件
事件总线
创建一个 Bus
类来负责事件的派发、监听与回调管理。
1 | class Bus { |
实践中可以用
Vue
代替Bus
,因为它已经实现了相应功能。
Vuex
创建唯一的全局数据管理者 store
,通过它来管理数据并通知组件变更状态。
插槽
插槽语法是 Vue
实现的内容分发 API。
匿名插槽
1 | <!-- comp1 --> |
具名插槽
将内容分发到子组件的指定位置。
1 | <!-- comp2 --> |
作用域插槽
分发的内容需要用到子组件中的数据。
1 | <!-- comp3 --> |
双向绑定
v-model 语法糖 value 和 @input
.sync
vue-router
hash/history
install => {
挂载$router
注册组件
}
router => {
解析路由配置
监听 hashchange 事件
响应 url 变化
组件切换
}
创建 Router 类
- 解析 routes 配置,生成 map
- 监听 url 变化
- 声明,注册组件 router-link router-view
实现插件 - 挂载$router
vuex
模块化
namespace
实现 Store 类
- state 响应化处理
- 保存状态,实现 dispatch,commit
实现插件 - 挂载$store
Vue SSR
SPA 请求次数多 => 首屏渲染速度慢
SEO 不友好
客户端发送请求 => 服务端将 vue 模板解析成 html(包含首屏所有需要的异步数据) => 返回给浏览器进行首屏渲染 => 同时转换为 SPA
缺点: 1.开发条件受限,例如 mouted 生命周期函数无法使用 2.服务端负载变大