3 回答
TA贡献1963条经验 获得超6个赞
JSX没有存储在您的Javascript中,而是存储为一组React.createElement命令。
因此,一个想法是拦截React.createElement并获取值。
然后逆向生成HTML。
下面是一个示例,它还不完整,但是您可以对其进行增强等。
当然,这并不是完美的,因为某些信息将会丢失。{2+xyz},已转换为9,因为在编译时已经对其进行了评估。
const ret = [];
const React = {createElement: (...args) => { return args}};
const xyz = 7;
const jsx = <div>
<div>hello <b>there {2+xyz}</b></div>
<span>span content {() => "abc"}</span>
</div>;
function render(jsx, indent = '') {
let ret = '';
ret += `${indent}<${jsx[0]}>`;
for (let l = 2; l < jsx.length; l += 1) {
const v = jsx[l];
if (Array.isArray(v)) ret += '\r\n' + render(v, indent + ' ')
else if (typeof v === 'function') ret += `{${v}}`;
else { ret += v; }
}
ret += `${indent}</${jsx[0]}>\r\n`;
return ret;
}
console.log(render(jsx));
添加回答
举报