vue

头像
sunala
    阅读 1 分钟

    vue中的data为什么是一个方法

    data,props,computed等重名

    initState的顺序
    props->methods->data->compute->watch

      if (opts.props) initProps(vm, opts.props)
      if (opts.methods) initMethods(vm, opts.methods)
      if (opts.data) {
        initData(vm)
      } else {
        observe(vm._data = {}, true /* asRootData */)
      }
      if (opts.computed) initComputed(vm, opts.computed)
      if (opts.watch && opts.watch !== nativeWatch) {
        initWatch(vm, opts.watch)
      }

    父组件props变化

    • 父组件改变props,子组件如果直接使用props,会触发子组件更新
    • 父组件改变props,子组件如果将props放进data中再使用,不会触发子组件更新
    • 父组件改变props,子组件如果将props放进computed中再使用,会触发子组件更新

    响应式

    Object.defineProperty把data,props等普通对象变成响应式对象,
    其中的getter就是做依赖收集,收集依赖的目的是为了当这些响应式数据发生变化,触发setter时能知道应该通知哪些订阅者去做相应的逻辑处理。
    在setter中,如果没找到响应式对象,则对新设置的值变成一个响应式对象。
    在setter中进行dep.notify()通知所有的订阅者。
    当数据发生变化的时候,触发 setter 逻辑,把在依赖过程中订阅的的所有观察者,也就是watcher,都触发它们的update过程,这个过程又利用了队列做了进一步优化,在nextTick后执行所有watcherrun,最后执行它们的回调函数

    数据的变化到 DOM 的重新渲染是一个异步过程,发生在下一个 tick。这就是我们平时在开发的过程中,比如从服务端接口去获取数据的时候,数据做了修改,如果我们的某些方法去依赖了数据修改后的 DOM 变化,我们就必须在nextTick后执行

    sameVnode的逻辑非常简单,如果两个vnodekey不相等,则是不同的;否则继续判断对于同步组件,则判断isCommentdatainput类型等是否相同,对于异步组件,则判断asyncFactory是否相同


    sunala
    1 声望0 粉丝

    « 上一篇
    前端算法
    下一篇 »
    webpack和react