Vue CLI 快速原型开发
安装工具
- npm install @vue/cli@3 -g
- npm install @vue/cli-service-global@3 -g
启动 vue serve
示例
1)son1改parent中的钱
入口文件 main.js
1 | import Vue from 'vue'; |
App.vue
1 | <!--根实例 根组件--> |
组件(components)
/components/parent.vue
1 | <template> |
/components/son1.vue
单向数据流 不能子组件直接修改父组件的数据 这里指mny 可以子组件点击让父组件修改
1 | <template> |
2) grandson1改parent中的钱
- 孙=>子=>父 三层触发
- .$parent.$parent.$parent 多级
/components/son1.vue
1 | <template> |
/components/grandson1.vue
1 | <template> |
- .$dispatch 自动向上查找
/components/grandson1.vue
1 | <template> |
main.js
1 | Vue.prototype.$dispatch = function(eventName,value){ |
3) 往下
注意:一定要先订阅,才能触发
触发所有子组件带有 eat 方法
main.js中写 $broadcast方法
1 | // 验证这个方法 在App.vue中加个say,底下子组件调用 |
App.vue
1 | <!--根实例 根组件--> |
parent.vue
1 | <template> |
son1.vue
1 | <template> |
点击App.vue中的 ,打印: parent-eat~ son-eat~~
4) 子组件 => 父组件(多种写法)
> 4.1
parent.vue
1 | <template> |
son2.vue
1 | <template> |
点击子组件 ,修改父组件 count的值 1 => 2
> 4.2
parent.vue
1 | <template> |
son2.vue
1 | <template> |
点击子组件 ,修改父组件 count的值 1 => 2
> 4.3
parent.vue
1 | <template> |
son.vue
1 | <template> |
点击子组件 ,修改父组件 count的值 1 => 3
> 4.4
parent.vue
1 | <template> |
son.vue
1 | <template> |
5) 传递多个属性
将多个属性 mny、count都传给son2
> 5.1 $attrs 属性的集合
parent.vue
1 | <Son2 :mny="mny" :count="count"></Son2> |
son2.vue
1 | <template> |
如下图:
> 5.2 props + $attrs
parent.vue
1 | <Son2 :mny="mny" :count="count"></Son2> |
son2.vue
1 | <template> |
如下图:
> 5.3 inheritAttrs
parent.vue
1 | <Son2 :mny="mny" :count="count"></Son2> |
son2.vue
1 | <template> |
如下图:
官方文档:
inheritAttrs: 默认情况下父作用域的不被认作 props 的特性绑定 (attribute bindings) 将会“回退”且作为普通的 HTML 特性应用在子组件的根元素上。当撰写包裹一个目标元素或另一个组件的组件时,这可能不会总是符合预期行为。通过设置 inheritAttrs 到 false,这些默认行为将会被去掉。而通过 (同样是 2.4 新增的) 实例属性 $attrs 可以让这些特性生效,且可以通过 v-bind 显性的绑定到非根元素上。 inheritAttrs默认为true。
> 5.4 $attrs 应用
父传递给子 => 儿子 有属性用不到 => 孙子
parent.vue
1 | <Son2 :mny="mny" :count="count"></Son2> |
son2.vue
1 | <template> |
如下图:
6) 传递事件
要给组件传递一个show方法 跨组件传递 父 => 孙
> 6.1 .native
parent.vue
1 | <template> |
> 6.2 $listeners
现在希望点击 grandson2 中的 button 时才触发 parent 中的 show 方法
在son2中添加$listeners
parnet.vue
1 | <!-- 现在希望点击grandson中的button时才触发show方法 在son2中添加$listeners 这里的 @click @mouseup 都不是原生事件 同名而已--> |
son2.vue
1 | <template> |
grandson2.vue
1 | <template> |
如上,点击 grandson2.vue 中的 button 触发的是 parent.vue 中的say方法
> 6.3 provide && inject
grandson2.vue 触发 App.vue 中的方法
App.vue
1 | <script> |
grandson2.vue
1 | <script> |
> 6.4 ref && $ref
parent.vue
1 | <template> |
son2.vue
1 | <script> |
如上,页面弹出 alert(“ref示例”);
和上述 provide && inject
相反,provide && inject
是父组件将实例暴露出来供子组件调用,ref
是父组件去调用子组件的实例。
> 6.5 $bus
main.js
1 | // 创建一个全局的发布订阅 偶尔用一次还可以,使用起来比较混乱 |
parent.vue
1 | <script> |
grandson2.vue
1 | <script> |
总结
- 父传递给子数据 props emit (这个用的多些)
- $parent $children
- $attrs $listeners
- provide inject 和 context很像 (可以在父组件中声明一个公共数据),在子组件中可以注入原理 (特点:比较混乱,名称问题 他不会在业务代码中使用) 组件库 多级通信时为了方便可以使用provide
- ref 能获取真实dom元素,如果放到组件上 代表的是 当前组件的实例 ,父组件中可以直接获取子组件的方法或者数据 示例 6.4
- eventbus (像 $parent,$children 中,比如 a.$on() 必须 a.$emit() 来触发, b.$emit() 不行) 绑定 $on 只能通过绑定 $on 的那个组件来触发, (这里 eventbus 使用混乱,不管在哪里绑定都能触发 $bus )
vue 初学者用 props + emit 就够用了