-
Notifications
You must be signed in to change notification settings - Fork 1.6k
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
面试官:说说你对双向绑定的理解? #2
Comments
一、什么是双向绑定我们先从单向绑定切入单向绑定非常简单,就是把 当用户填写表单时, 二、双向绑定的原理是什么我们都知道
而上面的这个分层的架构方案,可以用一个专业术语进行称呼: 理解ViewModel它的主要职责就是:
当然,它还有两个主要部分组成
三、实现双向绑定我们还是以
流程图如下: 实现先来一个构造函数:执行初始化,对 class Vue {
constructor(options) {
this.$options = options;
this.$data = options.data;
// 对data选项做响应式处理
observe(this.$data);
// 代理data到vm上
proxy(this);
// 执行编译
new Compile(options.el, this);
}
} 对 function observe(obj) {
if (typeof obj !== "object" || obj == null) {
return;
}
new Observer(obj);
}
class Observer {
constructor(value) {
this.value = value;
this.walk(value);
}
walk(obj) {
Object.keys(obj).forEach((key) => {
defineReactive(obj, key, obj[key]);
});
}
} 编译
|
为什么叫双向绑定,前面的双向绑定和后面的原理不是一个东西啊,而且原理和双向也不搭边。官网的双向绑定指的是v-model,而这只是v-bind和input的语法糖,本质还是单向。上面的原理是响应式原理,和双向绑定没什么关系。 |
请你说下响应式和双向绑定的关系 |
请你解释下单向和双向绑定本质上如何定义? |
这个原理用代码解释还存在问题,Watcher这个类没有说在哪里实例化,代码中没有体现出来 |
抛开代码实现,是不是可以说:
MVVM是双向绑定,MVC是单向绑定。
ike_yu ***@***.***> 于 2021年11月19日周五 09:05写道:
… 这个原理用代码解释还存在问题,Watcher这个类没有说在哪里实例化,代码中没有体现出来
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<#2 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ABKERGFFOLQXSVUJ7HSK5Z3UMWPG5ANCNFSM4UUZ2SCA>
.
|
我理解的双向数据绑定指的是数据和视图的绑定;响应式是指的数据的改变可以通知到全部的依赖,这种通知是单向的 |
在mvc的时代里,我们更改了一个状态,需要手动操作dom界面,把状态更新上去,在接受输入时,也要通过监听的方式,去更新状态,我理解的mvvm,把这两步揉到了一起,也即是vue官方的语法糖 |
因为数据响应式,所以数据和模板双向绑定。 |
|
可以具体解释下吗? 感觉上面讲到的也是响应式的原理。 个人理解数据双向绑定一般都v-model语法糖的本质,才学疏浅 请多指教 |
讲的很好,从很底层的原理出发的,通过observer将数据变成响应式的,然后在编译模板的时候针对每个模板所以来的对象创建一个watcher实例,这个实例会在转换成响应式的时候通过getter的方法加入到以来某个key的dep中,当这个数据发生变化的时候回触发这个setter方法,通过setter方法将dep收集到的依赖依次调用依赖中的更新方法,更新页面的视图。 |
据我了解,双向绑定是指的数据变导致视图更新,视图更新又会导致数据更新,这点可以通过在谷歌浏览器下载的vue数据查看插件来观察到。v-model是一个语法糖,可以解析成一个value属性和一个input事件,从而实现双向数据绑定。但是,想要一个数据在视图变化后能更新到数据内部,就需要这个数据是一个响应式的数据,因为响应式会监听这个数据,并且通过setter方法来向后台更新数据。所以,在我看来两者是分不开的,响应式是实现双向绑定的基础,双向绑定建立在这个基础上的。个人见解,有错请指出,谢谢。 |
这里把
BTW: 其实最初并没有关注这个问题,但是碰到面试的人也是这样的想法,同时发现网上有好多类似的观点,因此觉得有必要把这些概念理清。当然这也是个人观点,如有不对,还请指出。 参考: |
vue 实现的是数据的响应性,Vue 会自动跟踪 JavaScript 状态并在其发生变化时响应式地更新 DOM, 我认为你把 双向绑定 和 响应式 这两个概念给混淆了。 |
感谢科普~ |
这是vue1的响应式实现方式了,vue1才会有Compile类对数据变化做单个回调处理来更新视图,但是这样做颗粒度太细了,当多个数据量同时变化时(比如一个较长的v-for里面绑定的数据都有变化)开销是很大的。因此vue2的响应式是通过diff dom来进行reRender实现的,哪怕你10个 100个数据同时变化也都是通过diff dom来更新,而不是执行他们各自通过compile绑定的回调。而且当再次出现多个数据量同时变化时再结合异步任务可以优化成只进行一次diff dom从而一次性更新视图。这样做虽然对于单个数据变化来说,开销肯定是比vue1大的,但单次的dom的diff其实开销也很低,所以这是一次很有意义的性能优化。 |
所以说到底什么是双向绑定呢? |
标点符号是不是没标好,看的有点奇怪 |
看完了,这是我目前看到的讲的最好的内容,没有之一 |
Vue.js的双向绑定利用了JavaScript语言的特性,结合了响应式编程的原理。具体来说,Vue.js通过Object.defineProperty()方法对组件的数据对象进行劫持,把数据属性转换成getter/setter,并在内部跟踪依赖,在数据发生变动时通知视图进行更新。 |
双向绑定说的是v-model吧,这里的响应式原理watcher有点不对,vue2并不是每个key都会创建一个watcher,一个组件会创建一个watcher,watcher里使用了render函数,render函数里包含了数据的使用,也就触发了getter,从而手机依赖;所谓的依赖其实就是这个全局watcher,当数据改变时,会通知这个watcher去更新,然后就是patch,diff算法之类的 |
文章写的挺好的,要是能有面试官问起来,具体如何精简概括,就更好了 |
No description provided.
The text was updated successfully, but these errors were encountered: