- 响应式:数据改变时会触发其他联动。例如:模板中的数据绑定;计算属性的重新计算;
————————————————————————————————————————————————————
vm.$parent
- $parent 属性可以用来从一个子组件访问父组件的实例
vm.$root
- 在每个 new Vue 实例的子组件中,其根实例可以通过 $root 属性进行访问。子组件通过
this.$root
访问根组件及包含的data等。 - 如果当前实例没有父实例,此实例将会是其自己。
vm.$children
- 当前实例的直接子组件。需要注意 $children 并不保证顺序,也不是响应式的。如果你发现自己正在尝试使用 $children 来进行数据绑定,考虑使用一个数组配合 v-for 来生成子组件,并且使用 Array 作为真正的来源。
- 只包含组件,包括传入插槽的组件。不包括dom元素
vm.$refs
- $refs 只会在组件渲染完成之后生效,并且它们不是响应式的。你应该避免在模板或计算属性中访问 $refs。
- refs引用,在v-for循环中返回的是组件数组,即使只有一个匹配的ref名,依然返回数组
- ref有多个相同名时,返回最后一个对象(需验证)
vm.$slots
- 用来访问被插槽分发的内容(用来获取插入插槽的组件或元素)。每个具名插槽 有其相应的属性 (例如:slot="foo" 中的内容将会在 vm.$slots.foo 中被找到)。default 属性包括了所有没有被包含在具名插槽中的节点(数组)
vm.$scopedSlots
- 用来访问作用域插槽(用来获取插入作用域插槽的组件或元素,返回的是生成这个组件或元素的函数)。对于包括 默认 slot 在内的每一个插槽,该对象都包含一个返回相应 VNode 的函数。
props: ['message'],
render: function (createElement) {// `<div><slot :text="message"></slot></div>`return createElement('div', [this.$scopedSlots.default({ // default作用域插槽也可以具名text: this.message})])
}
————————————————————————————————————————————————————
全局Vue.directive / 局部directives
- 有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。
- update、componentUpdated是指指令绑定的当前组件发生改变,例如:在组件my-vue引用时绑定指令,该组件内部发生变化是不会触发事件的。
- 一个指令定义对象可以提供如下几个钩子函数 (均为可选):
- bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
- inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
- update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新。(更新是指绑定的数据更新而不是指界面渲染变化)
- componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。(更新是指绑定的数据更新而不是指界面渲染变化)
- unbind:只调用一次,指令与元素解绑时调用。
- 钩子函数的参数 (即 el、binding、vnode 和 oldVnode)
- el:指令所绑定的元素,可以用来直接操作 DOM 。除了 el 之外,其它参数都应该是只读的,切勿进行修改。如果需要在钩子之间共享数据,建议通过元素的 dataset(元素自定义特性,以data-开头) 来进行。
- binding:一个对象,包含以下属性:
- name:指令名,不包括 v- 前缀。
- value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2。(绑定vue实例下的数据)
- oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
- expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"。
- arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"。(传入固定值)
- modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。
- vnode:Vue 编译生成的虚拟节点。(vnode并不是vue实例,而是vue实例中渲染函数render执行后生成的结果)
- oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
Vue.directive('demo', {bind: function (el, binding, vnode) {var s = JSON.stringifyel.innerHTML ='name: ' + s(binding.name) + '<br>' +'value: ' + s(binding.value) + '<br>' +'expression: ' + s(binding.expression) + '<br>' +'argument: ' + s(binding.arg) + '<br>' +'modifiers: ' + s(binding.modifiers) + '<br>' +'vnode keys: ' + Object.keys(vnode).join(', ')}
})
- 在很多时候,你可能想在 bind 和 update 时触发相同行为,而不关心其它的钩子。
Vue.directive('color-swatch', function (el, binding) {el.style.backgroundColor = binding.value
})