从网上学习然后自己实现的vue双向绑定,只要input输入过多,浏览器就会崩溃,为什么?

发布于 2022-09-11 18:42:55 字数 3364 浏览 8 评论 0

一下是我实现的部分代码:

Observe

function Observe(data) {
        this.observe(data);
    }
    Observe.prototype = {
        observe:function(data) {
            if(!data || typeof data !== 'object') return;
            for(var key in data) {
                this.defineReacted(data, key, data[key])
            }
        },
        defineReacted(obj, key, val) {
            this.observe(val);
            var dep = new Dep();
            Object.defineProperty(obj, key, {
                enumerable: true,
                configurable: true,
                get: function() {
                    if(Dep.target) {
                        dep.addSub(Dep.target);
                    }
                    return val;
                },
                set:function(value) {
                    if(value === val) return;
                    val = value;
                    dep.notify(); 
                }
            })
        }
    }

Compiler

function Compiler(el, vm){
        this.el = el;
        this.vm = vm;
        this.init();
    }
    Compiler.prototype = {
        init: function(){
            var fragment = this.createFragment(this.el);
            this.compiler(fragment);
            this.el.appendChild(fragment);
        },
        createFragment: function(el) {
            var segment = document.createDocumentFragment();
            var child = el.firstChild;
            while(child) {
                segment.appendChild(child);
                child = el.firstChild;
            }
            return segment;
        },
        compiler: function(el){
            var nodes = el.childNodes;
            var _this = this;
            if(!nodes || !nodes.length) return new Error('没有节点');
            [].forEach.call(nodes, function(node){
                _this.compilerElement(node);
                _this.compilerAttrs(node);
                if(node.childNodes) {
                    _this.compiler(node);
                }
            })
        },
        compilerText: function(node, exp) {
            var _this = this;
            var initdata = this.vm[exp];
            this.updateText(node, initdata)
            new Watcher(this.vm,exp,function(val) {
                _this.updateText(node,val)
            })
        },
        compilerElement: function(node) {
            var reg = /\{\{(.*)\}\}/;
            var content = node.textContent;
            if(content && reg.test(content)) {
                var text = reg.exec(content)[1];
                this.compilerText(node,text);
            }
        },
        updateText: function(node, val) {
            node.textContent = val ? val : '';
        }
        ...
   }

Watcher

 function Watcher(vm, ext, cb) {
        this.vm = vm;
        this.ext = ext;
        this.cb = cb;
        this.value = this.get();
    }
    Watcher.prototype = {
        get: function() {
            Dep.target = this;
            var value = this.vm[this.ext];
            Dep.targte = null;
            return value;
        },
        update: function() {
            var newVal = this.vm[this.ext];
            var oldVal = this.value;
            if(newVal === this.value) return;
            this.value = newVal;
            this.cb.call(this.vm,newVal,oldVal);
        }
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

过期情话 2022-09-18 18:42:55

你把 v-model换成v-model.lazy 试试

心房敞 2022-09-18 18:42:55
createFragment: function(el) {
    var segment = document.createDocumentFragment();
    var child = el.firstChild;
    while(child) {
        segment.appendChild(child);
        child = el.firstChild;
    }
    return segment;
},

这一块循环有问题吧

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文