-
Notifications
You must be signed in to change notification settings - Fork 3.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
第 29 题:聊聊 Vue 的双向数据绑定,Model 如何改变 View,View 又是如何改变 Model 的 #34
Comments
始终感觉这个问题有点问题,明明是单向绑定,只是 m -> v,在 vue 2.x 中 通过 defineProperty 实现的数据劫持,getter 收集依赖,setter 调用更新回调,这个过程是 vue 黑盒提供的,也就是说数据驱动视图,开发人员只需关注数据的变更即可;再说 v -> m,通过 v-model 的方式,指令添加是开发人员加的吧,如果一个组件有多个 v-model ,你要自己写 v-on 和 data 的修改吧。 |
核心是利用ES5的Object.defineProperty,这也是Vue.js为什么不能兼容IE8及以下浏览器的原因。
依赖收集getter(重点关注以下两点)
Dep是一个Class,它定义了一些属性和方法,它有一个静态属性target,这是一个全局唯一Watcher【同一时间内只能有一个全局的Watcher被计算】。Dep实际上就是对Watcher的一种管理,Dep脱离Watcher单独存在是没有意义的。Watcher和Dep就是典型的观察者设计模式。 Watcher是一个Class,在它的构造函数中定义了一些和Dep相关的属性:
收集过程:当我们实例化一个渲染watcher的时候,首先进入watcher的构造函数逻辑,然后执行他的
考虑到Vue是数据驱动的,所以每次数据变化都会重写Render,那么 收集依赖的目的是为了当这些响应式数据发生变化,触发它们的setter的时候,能知道应该通知哪些订阅者去做相应的逻辑处理【派发更新】 派发更新setter(重点关注以下两点)
派发过程:当我们组件中对响应的数据做了修改,就会触发setter的逻辑,最后调用 update函数中有个 队列排序保证:
run函数解析:先通过 手写一个数据绑定:
|
vue通过Object.defineProperty 劫持传进来的数据, 然后在数据getter的时候订阅重新编译模板的消息,然后通过js监听元素的事件,这里input事件也好,keyup事件也好,总是监听输入框值变化,将新的值重新赋值给被劫持的data,这样就会触发setter函数,再setter函数中就会去发布重新编译模板的消息; |
从页面渲染到加载数据,依赖于ES5的object.defindeProperty 此时收益数据依赖并当数据reactive,当修改数据的时候触发set 调用以来的notify并触发更新 |
Model 改变 View的过程: 依赖于ES5的object.defindeProperty,通过 defineProperty 实现的数据劫持,getter 收集依赖,setter 调用更新回调(不同于观察者模式,是发布订阅 + 中介) 附带补一个问题, 如果react也要双向绑定(虽然推荐是单向的),其实早期mixin【React.addons.LinkedStateMixin】可以实现, 也就是搞一些简单的setstate封装吧 |
v-model是v-bind和v-on的语法糖。 |
其实都是单向数据流,v-model也只是语法糖。主要思想还是 数据驱动 视图,按照这个去开发就完事了。不要写的不伦不类 |
input 中输入内容,焦点会消失 |
这样会不会更简洁一些 |
想问一下Vue的双向绑定和vue的响应式原理有什么不同啊 |
双向数据绑定不应该指v-model吗?而Object.defineProperty那一坨流程是Vue响应式系统吧? |
Vue 的双向数据绑定和响应式数据是两个不同的概念。 双向数据绑定
这种双向绑定可以通过 v-model 指令来实现,例如: <input type="text" v-model="message"> 上面的代码表示将输入框与 Vue 实例中的 响应式数据Vue 中的响应式数据指的是当一个组件的数据发生变化时,Vue 会自动检测到这些变化,并且重新渲染视图。 Vue 通过 const data = { message: 'Hello, Vue!' }
const vm = new Vue({
el: '#app',
data: data
}) 上面的代码创建了一个 Vue 实例,并将 因此:
|
The text was updated successfully, but these errors were encountered: