如何在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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,915評論 18 139
  • js API1.全局對象NAN 非數字值的特殊值infinity 代表正無窮的數據undefined 2.函數屬性...
    Aa劉德健閱讀 1,661評論 0 2
  • 官方中文版原文鏈接 感謝社區中各位的大力支持,譯者再次奉上一點點福利:阿里云產品券,享受所有官網優惠,并抽取幸運大...
    HetfieldJoe閱讀 6,577評論 3 22
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創建并操作數組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,270評論 0 4
  • 你的酒窩沒有酒,我卻醉的像條狗。
    桃桃淘氣掏鳥閱讀 140評論 0 0