Vue实例的属性和方法

阳光穿透心脏的1/2处 2022-02-18 10:59 474阅读 0赞

一、Vue之实例属性

image.png

Vue 实例暴露了一些有用的实例属性与方法。这些属性与方法都有前缀 $,以便与代理的数据属性区分

组件树

  • $parent:用来访问组件实例的父实例
  • $root: 用来访问当前组件树的根实例
  • $children:用来访问当前组件实例的直接子组件实例
  • $refs:用来访问v-ref指令的子组件

DOM访问

  • $el:用来挂载当前组件实例的dom元素
  • $els:用来访问$el元素中使用了v-el指令的DOM元素
    1. {
    2. { message }}

数据访问

  • $data:用来访问组件实例观察的数据对象
  • $options:用来访问组件实例化时的初始化选项对象

DOM方法的使用

  • $appendTo(elementOrSelector, callback):将el所指的DOM元素插入目标元素
  • $before(elementOrSelector, callback):将el所指的DOM元素或片段插入目标元素之前
  • $after(elementOrSelector, callback):将el所指的DOM元素或片段插入目标元素之后
  • $remove(callback):将el所指的DOM元素或片段从DOM中删除
  • $nextTick(callback):用来在下一次DOM更新循环后执行指定的回调函数

event方法的使用

  • 监听

    • $on(event, callback):监听实例的自定义事件
    • $once(event, callback):同上,但只能触发一次
  • 触发

    • $dispatch(event, args):派发事件,先在当前实例触发,再沿父链一层层向上,对应的监听函数返回false停止
    • $broadcast(event, args):广播事件,遍历当前实例的$children,如果对应的监听函数返回false,就停止
    • $emit(event, args):触发事件

    1. <p>{

    { num }}

    1. <button @click="increase1"> add </button>


#

2.1 $.watch()二、实例方法

  1. var data = { a: 1 }
  2. var vm = new Vue({
  3. el: '#example',
  4. data: data
  5. })
  6. vm.$data === data // -> true
  7. vm.$el === document.getElementById('example') // -> true
  8. // $watch 是一个实例方法
  9. vm.$watch('a', function (newVal, oldVal) {
  10. })
  11. // 这个回调将在 `vm.a` 改变后调用

#

2.2 vm.$nextTick

将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上

  1. <div id="app">
  2. </div>
  3. <button onclick="vm.$destroy()">销毁实例 $destroy</button>
  4. <button onclick="vm.$forceUpdate()">刷新构造器 $forceUpdate</button>
  5. <button onclick="edit()">更新 $.nextTick(fn)</button>
  6. <script>
  7. var Header = Vue.extend({
  8. template:`<p>{
  9. { message }}</p>`,
  10. data:function () {
  11. return {
  12. message:"I am message"
  13. }
  14. },
  15. updated:function () {
  16. console.log("updated 更新之后");
  17. },
  18. destroyed:function () {
  19. console.log("destroy 销毁之后");
  20. }
  21. });
  22. var vm = new Header().$mount("#app");
  23. function edit() {
  24. vm.message = "new message"; //更新数据
  25. vm.$nextTick(function () { //更新完成后调用
  26. console.log("更新完后,我被调用");
  27. })
  28. }

放在Vue.nextTick()回调函数中的执行的应该是会对DOM进行操作的 js代码

什么时候需要用的Vue.nextTick()

  • 你在Vue生命周期的created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中。原因是什么呢,原因是在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进Vue.nextTick()的回调函数中。与之对应的就是mounted钩子函数,因为该钩子函数执行时所有的DOM挂载和渲染都已完成,此时在该钩子函数中进行任何DOM操作都不会有问题 。
  • 在数据变化后要执行的某个操作,而这个操作需要使用随数据改变而改变的DOM结构的时候,这个操作都应该放进Vue.nextTick()的回调函数中

为了在数据变化之后等待 Vue 完成更新 DOM ,可以在数据变化之后立即使用 Vue.nextTick(callback) 。这样回调函数在 DOM 更新完成后就会调用


方法:

  1. vm.$mount()
  2. #手动挂载
  3. //vm.$mount('#itany');
  4. vm.$destroy()
  5. #销毁实例
  6. vm.$nextTick(callback)
  7. #将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待 DOM 更新。
  8. data:{
  9. user:{
  10. id:1001,
  11. name:'tom'
  12. }
  13. },
  14. vm.$set(object,key,value)
  15. #添加属性值
  16. Vue.set(this.user,'age',1)
  17. vm.$delete(object,key)
  18. #删除属性值
  19. Vue.delete(this.user,'age')
  20. vm.$watch(data,callback[,options])
  21. #更新属性值
  22. vm.$watch(data,callback[,options])
  23. #监测数值变化

实例属性:

929843-20171203201850616-1019255273.png

对应解释如下:

  1. vm._uid // 自增的id
  2. vm._isVue // 标示是vue对象,避免被observe
  3. vm._renderProxy // Proxy代理对象
  4. vm._self // 当前vm实例
  5. vm.$parent // 用于自定义子组件中,指向父组件的实例
  6. vm.$root // 指向根vm实例
  7. vm.$children // 当前组件的子组件实例数组
  8. vm.$refs
  9. vm._watcher = null
  10. vm._inactive = null
  11. vm._directInactive = false
  12. vm._isMounted = false // 标识是否已挂载
  13. vm._isDestroyed = false // 标识是否已销毁
  14. vm._isBeingDestroyed = false // 标识是否正在销毁
  15. vm._events // 当前元素上绑定的自定义事件
  16. vm._hasHookEvent // 标示是否有hook:开头的事件
  17. vm.$vnode // 当前自定义组件在父组件中的vnode,等同于vm.$options._parentVnode
  18. vm._vnode // 当前组件的vnode
  19. vm._staticTrees // 当前组件模板内分析出的静态内容的render函数数组
  20. vm.$el // 当前组件对应的根元素
  21. vm.$slots // 定义在父组件中的slots,是个对象键为name,值为响应的数组
  22. vm.$scopedSlots = emptyObject
  23. // 内部render函数使用的创建vnode的方法
  24. vm._c = (a, b, c, d) => createElement(vm, a, b, c, d, false)
  25. // 用户自定义render方法时,传入的参数
  26. vm.$createElement = (a, b, c, d) => createElement(vm, a, b, c, d, true)
  27. vm._props // 被observe的存储props数据的对象
  28. vm._data // 被observe的存储data数据的对象
  29. vm._computedWatchers // 保存计算属性创建的watcher对象

看下实例方法,其实就是Vue原型上的方法了

929843-20171203202012007-1283069528.png

接下来主要看下vm.$options,其实也就是我们new Vue(options)options这个选项对象可传入的属性,一个很吊的对象。

  1. declare type ComponentOptions = {
  2. // data
  3. data: Object | Function | void; // 传入的data数据
  4. props?: { [key: string]: PropOptions }; // props传入的数据
  5. propsData?: ?Object; // 对于自定义组件,父级通过`props`传过来的数据
  6. computed?: { // 传入的计算属性
  7. [key: string]: Function | {
  8. get?: Function;
  9. set?: Function;
  10. cache?: boolean
  11. }
  12. };
  13. methods?: { [key: string]: Function }; // 传入的方法
  14. watch?: { [key: string]: Function | string }; // 传入的watch
  15. // DOM
  16. el?: string | Element; // 传入的el字符串
  17. template?: string; // 传入的模板字符串
  18. render: (h: () => VNode) => VNode; // 传入的render函数
  19. renderError?: (h: () => VNode, err: Error) => VNode;
  20. staticRenderFns?: Array<() => VNode>;
  21. // 钩子函数
  22. beforeCreate?: Function;
  23. created?: Function;
  24. beforeMount?: Function;
  25. mounted?: Function;
  26. beforeUpdate?: Function;
  27. updated?: Function;
  28. activated?: Function;
  29. deactivated?: Function;
  30. beforeDestroy?: Function;
  31. destroyed?: Function;
  32. // assets
  33. directives?: { [key: string]: Object }; // 指令
  34. components?: { [key: string]: Class<Component> }; // 子组件的定义
  35. transitions?: { [key: string]: Object };
  36. filters?: { [key: string]: Function }; // 过滤器
  37. // context
  38. provide?: { [key: string | Symbol]: any } | () => { [key: string | Symbol]: any };
  39. inject?: { [key: string]: string | Symbol } | Array<string>;
  40. // component v-model customization
  41. model?: {
  42. prop?: string;
  43. event?: string;
  44. };
  45. // misc
  46. parent?: Component; // 父组件实例
  47. mixins?: Array<Object>; // mixins传入的数据
  48. name?: string; // 当前的组件名
  49. extends?: Class<Component> | Object; // extends传入的数据
  50. delimiters?: [string, string]; // 模板分隔符
  51. // 私有属性,均为内部创建自定义组件的对象时使用
  52. _isComponent?: true; // 是否是组件
  53. _propKeys?: Array<string>; // props传入对象的键数组
  54. _parentVnode?: VNode; // 当前组件,在父组件中的VNode对象
  55. _parentListeners?: ?Object; // 当前组件,在父组件上绑定的事件
  56. _renderChildren?: ?Array<VNode>; // 父组件中定义在当前元素内的子元素的VNode数组(slot)
  57. _componentTag: ?string; // 自定义标签名
  58. _scopeId: ?string;
  59. _base: Class<Component>; // Vue
  60. _parentElm: ?Node; // 当前自定义组件的父级dom结点
  61. _refElm: ?Node; // 当前元素的nextSlibing元素,即当前dom要插入到_parentElm结点下的_refElm前
  62. }

发表评论

表情:
评论列表 (有 0 条评论,474人围观)

还没有评论,来说两句吧...

相关阅读