微信Vue框架构建Part5——渲染对象数据
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了微信Vue框架构建Part5——渲染对象数据,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2319字,纯文字阅读大概需要4分钟。
内容图文
概述
- 本节内容是在上一篇的基础上,实现对象类型的数据渲染,渲染到真实页面中
-
难点有:
- 如何知道单个vnode中有那些模板语法
- 如何实现知道模板语法对应的值
- 如何实现数据的替换,实现页面渲染
- 流程概览图示
找到模板语法
- 在上文中我们实现了模板和vnode之间的相互映射,且用Map对象保存,所以可通过Map的内置方法实现
-
代码实现
/** * 渲染虚拟DOM * @param {*} vm * @param {*} vnode */ function renderVNode(vm, vnode) { if (vnode.nodeType === NODE_TYPE_TEXT) { const templateArr = VNodeToTemplate.get(vnode); if (templateArr && templateArr.length) { for (let i = 0; i < templateArr.length; i++) { // 1.遍历vnode下所有的模板语法 // 2. 知道每个模板语法对应的值 // 3. 操作真实DOM,替换模板语法,实现数据渲染 } } } else { for (let i = 0; i < vnode.children.length; i++) { renderVNode(vm, vnode.children[i]); } } }
找到模板语法在data中的值
- vue中的data属性值是一个变量,所以我们将定义一个方法来实现这个功能
- 模板的数据可能有两个,一个是data中定义的,一个可能是类型v-for循环这样的局部变量
-
代码实现
/** * 返回模板语法对应的数据 * @param {*} dataArr 数据源 * @param {*} template 模板语法 */ export function getTemplateValue(dataArr, template) { let templateValue; if (dataArr instanceof Array) { for (let i = 0; i < dataArr.length; i++) { templateValue = getObectValue(dataArr[i], template); if (templateValue) break; } } return templateValue; } function getObectValue(obj, template) { let tempalteValue; const keyArr = template.split(\".\"); for (let i = 0; i < keyArr.length; i++) { const key = keyArr[i].trim(); const value = obj[key]; if (value instanceof Object) { // 数据是对象的情况 return (tempalteValue = getObectValue(value, template)); } else { tempalteValue = obj[key]; } } if (!tempalteValue) { throw new Error(`${template} is not undefined`); } return tempalteValue || \"undefined\"; }
拿到模板语法的值后,渲染数据
- 之前我们定义的vnode中有真实DOM,所以可以直接操作
- 通过正则实现模板语法的替换
-
代码实现
function renderVNode(vm, vnode) { if (vnode.nodeType === NODE_TYPE_TEXT) { const templateArr = VNodeToTemplate.get(vnode); if (templateArr && templateArr.length) { for (let i = 0; i < templateArr.length; i++) { // 获取模板语法的值 const templateValue = getTemplateValue( [vm._data, vnode.env], templateArr[i] ); let nodeValue; console.log(\"templateValue\", templateValue); // 如果模板语法有对应的值,就替换模板语法 if (templateValue) { nodeValue = vnode.text.replace( new RegExp(`{{[\\s|${templateArr[i]}|\\s]+}}`, \"g\"), templateValue ); } // 操作真实DOM,实现数据渲染 vnode.elm.nodeValue = nodeValue; } } } else { for (let i = 0; i < vnode.children.length; i++) { renderVNode(vm, vnode.children[i]); } } }
原文:https://www.cnblogs.com/imoooja/p/14945248.html
内容总结
以上是互联网集市为您收集整理的微信Vue框架构建Part5——渲染对象数据全部内容,希望文章能够帮你解决微信Vue框架构建Part5——渲染对象数据所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。