当前位置: 首页 > article >正文

手写MVVM框架-模板渲染2

上一章我们处理了在页面初始化的时候渲染模板,但是如果是在页面上修改了data里面的数据的话是不会修改的,这一章我们来实现这个功能。

添加renderData方法

我们在proxyObject处可以监控到用户改变数据,这个时候触发renderData方法

/**
 * data中数据发生变化立即重新渲染
 * @param {MiniVue} vm 
 * @param {string} data
 */
export function renderData(vm, data) {
    // 获取当前data关联的vnode数据
    const nodes = templateToNode.get(data)
    nodes && nodes.forEach((node)=> {
        renderNode(vm, node)
    })
}

我们在数据劫持的时候调用该方法 


/**
 * 代理Object数据
 * @param {*} vm 
 * @param {*} data 
 */
function proxyObject(vm, data, namespace) {
    // 创建代理对象
    let proxyObj = {}
    for(let key in data) {
        Object.defineProperty(proxyObj, key, {
            configurable: true, // 可配置
            get() {
                return data[key]
            },
            set(newValue) {
                data[key] = newValue
                renderData(vm, getNameSpace(namespace, key))
            }
        })
        // 为MiniVue的根实例添加属性
        Object.defineProperty(vm, key, {
            configurable: true, // 可配置
            get() {
                return data[key]
            },
            set(newValue) {
                data[key] = newValue
                renderData(vm, getNameSpace(namespace, key))
            }
        })
        if(typeof data[key] === 'object') {
            proxyObj[key] = constructProxy(vm, data[key], getNameSpace(namespace, key))
        }
    }
    return proxyObj
}

renderData 方法传递的第二个参数就是用户在模板中写的字符串, 这是我们就需要写一个方法getNameSpace来获取这个字符串

// src/core/proxy.js

function getNameSpace(nowNameSpace, nowProp) {
    if (nowNameSpace == null || nowNameSpace == "") {
        return nowProp;
    } else if (nowProp == null || nowProp == "") {
        return nowNameSpace;
    } else {
        return nowNameSpace + "." + nowProp;
    }
}

为了验证一些嵌套类型的数据修改,我们在入口文件index.js 中新增一个object类型的数据,并在index.html 中使用

OK 咱们现在在浏览器上修改data中的数据看效果(可以看到已经发生了改变)


http://www.kler.cn/a/534031.html

相关文章:

  • 数据结构:时间复杂度
  • 【LeetCode】5. 贪心算法:买卖股票时机
  • JDK9新特性
  • solidity高阶 -- 调用接口合约
  • 基于springboot的体质测试数据分析及可视化设计
  • QT:信号和槽
  • Unity中的虚拟相机(Cinemachine)
  • websocket 实现前后端通信
  • CG-35 总辐射传感器 铝合金材质
  • XML 元素 vs. 属性
  • 蓝桥杯思维训练营(四)
  • C_位运算符及其在单片机寄存器的操作
  • Windows图形界面(GUI)-QT-C/C++ - Qt Combo Box
  • MyBatis中的#{}与${}的区别和应用详解
  • iOS文字滚动:使用CATextLayer实现的跑马灯(附源码)
  • 2. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--什么是微服务--微服务概述与演变
  • 整理:熟悉MySQL的使用和运行原理,掌握索引、事务、锁等机制。了解存储引擎、读写分离、分库分表。
  • QT笔记——多语言翻译
  • 传感器——针孔相机模型
  • java开发面试自我介绍模板_java面试自我介绍3篇
  • 8-登录流程
  • kakailio官网推荐的安装流程ubuntu 22.04
  • 解决php8.3无法加载curl扩展
  • 【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信
  • 【R语言】数据操作
  • trinitycore服务器离线,原来是mysql里数据库flag设置为2离线状态了