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

手写MVVM框架-模板渲染1

虚拟dom创建好了,依赖也收集好了,这个时候就该去渲染dom了,把页面上的 { {name}} 渲染成具体的值。

渲染之前我们给原型上添加一个render方法

//代码在src/core/render.js

export function renderMixin(MiniVue) {
    MiniVue.prototype.$render = function() {
        renderNode(this, this._vnode)
    }
}

接下来实现renderNode方法

 实现的原理是:

1.传入根节点VNode, 如果当前节点是元素节点则重新调用该方法

2.如果是文本节点,则获取出来该节点依赖的模板

3.获取该模板对应的值 然后将值替换为模板


// 代码在src/core/render.js
import { getObjectValue } from '../utils/ObjectUtils'

export function renderMixin(MiniVue) {
    MiniVue.prototype.$render = function() {
        renderNode(this, this._vnode)
    }
}

/**
 * 渲染Node
 * @param {MiniVue} vm 
 * @param {*} vnode 
 * @returns 
 */
function renderNode(vm, vnode) {
    // 如果是文本节点
    if(vnode.nodeType === 3) {
        // 获取当前节点关联的模板
        const templateArray = vnodeToTemplate.get(vnode)
        // 如果当前节点里面有模板
        if(templateArray) {
            // 获取文本内容
            let result = vnode.text
            // 遍历模板
            templateArray.forEach(template => {
                let templateValue = getTemplateValue([vm._data, vnode.env], template)
                result = result.replace(`{
  
  {${template}}}`, templateValue)
            })
            vnode.ele.nodeValue = result
        }
    } else { // 继续调用renderNode
        vnode.children.forEach(childVNode => {
            renderNode(vm, childVNode)
        })
    }

}



// 获取文本中的模板
function getTemplateValue(objs, template) {
    for(let i = 0; i < objs.length; i++) {
        let templateValue = getObjectValue(objs[i], template);
        if(templateValue != null) {
            return templateValue;
        }
    }
    return null;
}

其中getObjectValue 的实现为:

/**
 * 在一个Object里面取出来key的值
 * @param {Object} obj 
 * @param {String} key a, obj.a
 */
export function getObjectValue(obj, keys) {
    if(!obj) return obj
    let keyList = keys.split('.')
    let temp = undefined;
    keyList.forEach((item)=> {
        if(obj[item] != null) {
            temp = obj[item]
        }
    })
    return temp
}

然后把render 方法挂载到原型上并调用

现在再查看页面上的效果发现,模板已经被替换成了具体的值


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

相关文章:

  • kubernetes 核心技术-集群安全机制 RBAC
  • C#使用实体类Entity Framework Core操作mysql入门:从数据库反向生成模型2 处理连接字符串
  • openRv1126 AI算法部署实战之——Tensorflow模型部署实战
  • Spring PropertyPlaceholderConfigurer多配置问题
  • 2.3学习总结
  • 每日一题——小根堆实现堆排序算法
  • 什么是REStful API,其设计核心原则(core principle)是什么
  • 深入解析 Redis AOF 机制:持久化原理、重写优化与 COW 影响
  • MyBatis 初级
  • 基于SpringBoot的物资管理系统
  • 面经--C语言——内存泄漏、malloc和new的区别 .c文件怎么转换为可执行程序 uart和usart的区别 继承的访问权限总结
  • 蓝桥杯python基础算法(2-2)——基础算法(F)——差分
  • 【CPP】异步操作的底层原理与应用举例
  • 一文速览DeepSeek-R1的本地部署——可联网、可实现本地知识库问答:包括671B满血版和各个蒸馏版的部署
  • 基于springboot+vue的中药实验管理系统(源码+数据库+文档)
  • LeetCode --- 434周赛
  • kubernetes学习-配置管理(九)
  • 【Linux探索学习】第二十八弹——信号(下):信号在内核中的处理及信号捕捉详解
  • vscode搭建git
  • 寒假(一)
  • 安培定律应用于 BH 曲线上的工作点
  • visual studio安装
  • Java Stream实战_函数式编程的新方式
  • 具身智能-强化学习-强化学习基础-马尔可夫
  • 【暴力搜索】有效的数独
  • python给文件夹和文件进行zip加密压缩