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
后执行所有watcher
的run
,最后执行它们的回调函数
数据的变化到 DOM 的重新渲染是一个异步过程,发生在下一个 tick。这就是我们平时在开发的过程中,比如从服务端接口去获取数据的时候,数据做了修改,如果我们的某些方法去依赖了数据修改后的 DOM 变化,我们就必须在nextTick
后执行
sameVnode
的逻辑非常简单,如果两个vnode
的key
不相等,则是不同的;否则继续判断对于同步组件,则判断isComment
、data
、input
类型等是否相同,对于异步组件,则判断asyncFactory
是否相同
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。