Open anjia opened 5 years ago
/utils/event-bus.js
import Vue from 'vue'
export const EventBus = new Vue()
使用:
import { EventBus } from '@/utils/event-bus'
EventBus.$emit('custom_event_name', this.data) // 发送事件
EventBus.$on('custom_event_name', (data) => {}) // 监听事件
EventBus.$off('custom_event_name') // 销毁
注意:
$on()
再 $emit()
$off()
。否则会监听到多次路由,从组件 A -> B。使用如下:
// 组件A
beforeDestroy() {
EventBus.$emit()
}
// 组件 B
beforeCreate() {
EventBus.$on()
}
beforeDestroy() {
EventBus.$off()
}
说明:注意它两的生命周期,确保先 $on()
再 $emit()
不适用的情况:
vm.$on()
监听 当前实例上的自定义事件 vm.$emit()
分发 当前实例上的事件 vm.$off()
取消监听该事件的监听器...
vm.$once()
监听事件,但只触发一次
$on 和 $off 配对
let vm = this
vm.$data
实例观察的数据对象。datavm.$options
当前 Vue 实例的初始化选项vm.$props
当前组件接收到的 props 对象vm.$attrs
包含了父作用域中不作为 prop 被识别的特性绑定,除了class
和style
vm.$listeners
包含了父作用域中的v-on
事件监听器vm.$root
当前组件树的根 Vue 实例vm.$el
Vue 实例使用的根 DOM 元素vm.$parent
父实例,如果有的话vm.$children
当前实例的直接子组件。并不保证顺序、也不是响应式的vm.$refs
注册过ref
特性的所有 DOM 元素和组件实例。子组件引用、特殊特性-refvm.$slots
被插槽分发的内容。这在渲染函数里特别有用。插槽
v-slot
指令比slot
和slot-scope
更新
<slot></slot>
<slot>默认值</slot>
<slot name="header"></slot>
name
属性的,默认名字是 default
<template v-slot:xxx>...</template>
中的内容都会被视为默认插槽的内容<slot>
元素上
<slot v-bind:user="user">{{ user.lastName }}<slot>
<template>
的语法<current-user v-slot="slotProps">{{ slotProps.user.firstName }}</current-user>
v-slot
的值,可以是任何的 JS 表达式,eg.可以使用ES2015解构传入具体的插槽 prop<template v-slot:[dynamicSlotName]>...</template>
eg.动态参数vm.$scopedSlots
用来访问作用域插槽。这在渲染函数里特别有用。推荐
vm.$slots
相比,更推荐用vm.$scopedSlots
v-on
是v-bind
的缩写#header
是v-slot:header
的缩写
vm.$isServer
当前 Vue 实例是否运行于服务器。详见 服务端渲染v-text
:<span v-text="msg"></span>
同 <span>{{msg}}</span>
v-html
仅在可信内容上用
scoped
的样式不会用在v-html
内部,因为那部分 HTML 没有被 Vue 的模板编译器处理v-html
设置带作用域的 CSS,可以替换成CSS Modules 或者额外的全局样式-用类似BEM的作用域策略v-show
始终会被渲染在DOM,它只是简单地切换CSS属性display
<template>
元素,也不支持v-else
v-if
v-else
v-else-if
v-show
和v-if
的区别
v-show
相比,v-if
是真正的条件渲染
v-show
有更高的初始渲染开销,因为它始终会被渲染DOM-不论初始条件是什么v-if
有更高的切换开销,因为它会确保条件块内的事件监听器和子组件适当地被销毁和重建v-show
适合频繁地切换v-if
适合运行时条件很少改变v-for
v-on
v-bind
v-model
v-slot
v-pre
跳过大量没有指令的节点会加快编译。跳过这个元素和它的子元素的编译过程。v-once
只渲染元素和组件一次。优化更新性能v-cloak
适用场景:对普通 DOM 元素进行底层操作
Vue.directive(); // 注册一个全局自定义指令 v-xx
Vue.component(); // 注册组件,directives 选项可注册局部指令
钩子函数:
bind
:指令第一次绑定到元素时调用,只调用一次(适合一次性的初始化设置)inserted
:被绑元素插入到父元素时调用(插入到父元素,未必被插入到文档中)update
:所在组件的 VNode 更新时(也可能发生在子 VNode 更新之前,VNodes-虚拟 DOM)componentUpdated
:指令所在组件的 VNode 及其子 VNode 全部更新后调用unbind
:指令与元素解绑时调用,只调用一次钩子函数的参数:
el
:指令所绑的元素,可直接操作 DOMbinding
:指令相关的值。详见下方示例vnode
:Vue 编译生成的虚拟节点,VNode APIoldVnode
除了
el
,其它参数都只读 如要在钩子中间共享数据,可通过元素的dataset
参数说明:
<div v-demo:[argument]="value"></div>
这里 argument
便可以根据组件示例的数据进行更新<div v-demo="{name:'anjia', age:3}"></div>
示例:
<div id="hook-arguments-example" v-demo:foo.a.b="message"></div>
<script>
Vue.directive('demo', {
bind: function (el, binding, vnode) {
var s = JSON.stringify
el.innerHTML =
'name: ' + s(binding.name) + '<br>' + // demo
'value: ' + s(binding.value) + '<br>' + // hello!
'expression: ' + s(binding.expression) + '<br>' + // message
'argument: ' + s(binding.arg) + '<br>' + // foo
'modifiers: ' + s(binding.modifiers) + '<br>' + // {"a":true, "b":true} 包含修饰符的对象
'vnode keys: ' + Object.keys(vnode).join(', ') // tag,data,....
}
})
new Vue({
el: '#hook-arguments-example',
data: {
message: 'hello!'
}
})
</script>
目录
vm.$watch
vm.$set
vm.$delete
vm.$mount
vm.$forceUpdate
vm.$nextTick
vm.$destory
key
主要用在 Vue 的虚拟 DOM 算法ref
用来给元素或子组件注册引用信息。子组件引用is
用于动态组件且基于 DOM 内模板的限制来工作。动态组件、DOM模板解析说明slot
slot-scope
scope