如何在js中优雅地写HTML模板

注释形式写在js中,然后用Function.prototype.toString方法拿到。

var compile = function (functionObject) {
    return functionObject.toString().match(/\/\*([\s\S]*?)\*\//)[1];
};

var html = compile(function () {/*
 <div>
     <h2>title</h2>
     <div class="content">content</div>
 </div>
 */
});

作为模板,当然还需要关键词的替换功能。接下来实现它!

参考ES6中的template string:

`
 <div>
     <h2>${title}</h2>
     <div class="content">${content}</div>
 </div>
`

只需要替换符合/\$\{\w.+\}/g这个正则的文本即可。

用replace方法:

.replace(/\$\{\w.+\}/g, function (variable) {
    return otherValue;
});

去掉${},然后返回实际值即可。

var compile = function (functionObject) {
    return function (it) {
        return functionObject.toString().match(/\/\*([\s\S]*?)\*\//)[1].replace(/\$\{\w.+\}/g, function (variable) {
            return it[variable];
        });
    }
};

测试下:

var toHtml1 = compile(function () {/*
 <div>
     <h2>${title}</h2>
     <div class="content">${content}</div>
 </div>
 */
});
var test2 = {
    title: 'title string 2',
    content: 'content string 2'
};
document.body.innerHTML += toHtml1(test2);

那么如果变量是这样的呢<h2>${data.title}</h2>

只需要用.分割字符串,然后逐步拿到值就行了:

var value = it;
variable = variable.replace('${', '').replace('}', '');
variable.split('.').forEach(function (section) {
    value = value[section];
});
return value;

测试下:

var test3 = {
    data: {
        title: 'title string 3',
        content: 'content string 3'
    }
};
var toHtml3 = compile(function () {/*
 <div>
 <h2>${data.title}</h2>
 <div class="content">${data.content}</div>
 </div>
 */
});
toHtml3(test3);
"
<div>
<h2>title string 3</h2>
<div class="content">content string 3</div>
</div>
"

See example here.

另:已经有人造了轮子:multiline

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,828评论 19 139
  • js API1.全局对象NAN 非数字值的特殊值infinity 代表正无穷的数据undefined 2.函数属性...
    Aa刘德健阅读 5,552评论 0 2
  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 11,592评论 3 22
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,635评论 0 4
  • 你的酒窝没有酒,我却醉的像条狗。
    桃桃淘气掏鸟阅读 1,198评论 0 0

友情链接更多精彩内容