难点有:
代码实现
/**
* 渲染虚拟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]);
}
}
}
代码实现
/**
* 返回模板语法对应的数据
* @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\";
}
代码实现
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