MVVM基础,实现vue双向绑定功能

本文探讨了如何使用ES6的proxy实现MVVM模式,通过新Proxy API监控数据变化,并结合Vue3的视图更新机制,展示了如何在JavaScript中创建轻量级的数据绑定。作者通过实例讲解了数据监听和视图渲染的优化过程。
摘要由CSDN通过智能技术生成
    <div id="box"></div>
    <script>
        // 1/数据
        let model = {
            name: "张四",
            age: 11
        }

        //3 /viewmodel 
        Object.keys(model).forEach(item => observer(model, item, model[item]))		//把数据进行遍历,然后把新值放入下列函数中
        function observer(target, key, value) {
            Object.defineProperty(target, key, {
                get() {
                    //监听对象属性的访问
                    return value	
                },
                set(newval) {
                    //监听对象属性的修改,可传入新值
                    value = newval
                    watch()
                }
            })
        }

        function watch() {
            rander()
        }

        // 2、视图
        function rander() {
            box.innerHTML = `
                <span>${model.name}</span>
                <button οnclick="btn()">点我</button>
            `
        }
        rander()

        function btn() {
            model.name = "小王八"
        }
    </script>
=======================ES6--MVVM=================================
ES6新增了proxy,进行了优化,vue3进行采用,vue2还是使用的循环
 <div id="box"></div>
    <script>
        // ES6 劫持 vue3使用
        // 1/数据
        let model = {       //定义数据
                name: "张三",
                age: 13,
                sex: "男"
            }
              // 3、viewmodel 视图模型
        // 3-1.监听对象属性的变化
        let newModel = new Proxy(model, {       //新变量接收值,传入变量
                get(target, key) {          //一个是数据 一个是键名
                    //监听对象属性的访问
                    console.log("属性被访问");
                    return target[key]      //获取到键值
                },
                set(target, key, value) {       //数据。键名。键值
                    //监听对象属性的修改
                    console.log("属性被修改了");
                    target[key] = value         //键值=传入进去的新值
                    watch()                 //进行监听渲染
                }
            })
            //3-2.自动更新视图观察者
        function watch() {          //监听数据
            render()
        }
            // 2、视图
        function render() {     //定义视图数据函数
            box.innerHTML = `
                    <span>${model.name}</span>
                    <span>${model.age}</span>
                    <span>${model.sex}</span>
                    <button οnclick="btn()">点击</button>
                `
        }
        render()        //进行渲染

        function btn() {        //点击事件改变其值(这里是改变新值)
            newModel.name = "张四"
            newModel.age = 31
            newModel.sex = "女"
        }
      
    </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值