Vue:通过Object.defineProperty实现一个简易的MiniVue

简介: Vue:通过Object.defineProperty实现一个简易的MiniVue
<div id="app"></div>
<script>
    class MiniVue {
        constructor(options) {
            // 挂载点
            this.$el = document.querySelector(options.el);
            // 模板
            this.$template = options.template;
            // 数据
            this.$data = options.data;
            this._initApp()
        }
        // 初始化工作
        _initApp() {
            this._updateView();
            this._initProxyData();
        }
        // 劫持代理data
        _initProxyData() {
            // 将data劫持代理到this上
            let that = this;
            for (let key in this.$data) {
                Object.defineProperty(this, key, {
                    get() {
                        // 获取数据之前做些事情
                        return that.$data[key];
                    },
                    set(val) {
                        that.$data[key] = val;
                        // 设置数据之后将视图更新
                        that._updateView();
                    }
                })
            }
        }
        // 模板渲染
        _renderTemplate() {
            let template = this.$template;
            for (let key in this.$data) {
                template = template.replace(`{{${key}}}`, this.$data[key])
            }
            return template;
        }
        // 设置视图显示
        _updateView() {
            this.$el.innerHTML = this._renderTemplate();
        }
    }
    // 实例化
    var app = new MiniVue({
        el: '#app',
        template: '<h1>{{name}}</h1> <h2>{{age}}</h2>',
        data: {
            name: 'Tom',
            age: 23,
        },
    })
</script>

在控制台修改app的数据,界面上的显示也将会同步更新

$ app.age = 31
相关文章
|
1月前
|
JavaScript
vue学习(7)Object.defineProperty
vue学习(7)Object.defineProperty
33 2
|
6天前
|
JavaScript
Vue 的响应式原理中 Object.defineProperty 有什么缺陷
Vue 的响应式原理主要依赖于 `Object.defineProperty`,但该方法存在一些缺陷:无法检测到对象属性的添加和删除,且对大量数据进行代理时性能较差。Vue 3 中改用了 Proxy 来解决这些问题。
|
5月前
|
JavaScript
Vue报错 Invalid default value for prop “list“: Props with type Object/Array must use a factory
Vue报错 Invalid default value for prop “list“: Props with type Object/Array must use a factory
301 0
|
5月前
|
JavaScript
Vue : Object.defineProperty()
Vue : Object.defineProperty()
40 2
|
5月前
|
JavaScript 数据安全/隐私保护 开发者
常见的vue面试中的proxy和object.defineProperty的区别
常见的vue面试中的proxy和object.defineProperty的区别
|
5月前
|
JavaScript
[Vue warn]: Method “components“ has type “object“ in the component definition. Did you reference the
[Vue warn]: Method “components“ has type “object“ in the component definition. Did you reference the
|
12月前
|
JSON JavaScript 数据格式
vue query传参刷新后数据变成[Object Object]
vue query传参刷新后数据变成[Object Object]
132 0
|
12月前
|
人工智能 自然语言处理 JavaScript
vue.runtime.esm.js?2b0e:619 [Vue warn]: Error in created hook: “TypeError: Object(...) is not a func
vue.runtime.esm.js?2b0e:619 [Vue warn]: Error in created hook: “TypeError: Object(...) is not a func
99 0
|
JavaScript 容器
Vue初学-----模板语法,数据绑定,Object.defineProperty()事件等基础1
Vue初学-----模板语法,数据绑定,Object.defineProperty()事件等基础1
|
JavaScript 前端开发 API
Vue数据监听Object.definedProperty()方法的实现
Vue数据监听Object.definedProperty()方法的实现