從乙個實際需求出發認識模板引擎
實現乙個模板引擎的思路及步驟
當我們需要用js渲染乙個歌曲列表的時候,由於資料需要向後端請求,所以實現不能在html中把資料寫死。
如下所示,我們需要在頁面上展示這樣乙個列表,
但是卻不能像下面一樣把資料寫死在li標籤中。
這個時候有兩種我們容易思考得到的方法來解決這個問題,乙個是html字串拼接,另一種是構建dom物件。
第一種:html字串拼接
第二種:構建dom物件
但是這兩種方法都有很大缺陷:
第一種方法容易漏引號,出現拼接錯誤。
第二種方法則是**量增加,雖然可以用jquery來減少**量,但依然不是最優選擇。
這兩種方法的共同特徵都是需要建立乙個li標籤,然後裡面的內容動態獲取
var li = ''+ songs[i].name +'-'+songs[i].singer''
在這裡我們可以使用一種更好的辦法,
var li = stringformat(' -
', songs[0].name, songs[0].singer)
構建乙個stringformat函式,向裡面傳入引數,第一引數是模板,,會被後面傳入的兩個引數替換,這樣當函式執行後返回的就是乙個字串
"some like it hot!! - spyairli>"
這個stringformat函式可以說,就是乙個最為粗略的模板引擎了。
傳入的引數:
' -
'
就是乙個模板,所謂的模板引擎就是能夠解析含有特殊字元的邏輯**,簡化字串拼接前端渲染小外掛程式。
但是這樣的話,就必須把這部分函式寫在script標籤中,否則無法區分哪部分是html**,哪部分是邏輯**,所以我們需要特殊的字元來表示,這個特殊的字元就是定界符,
比如這個模板,使用的定界符就是:
'hello, my name is . i\'m years old.
';
以上舉例的模板還並不算複雜,當我們遇到下面這個模板的時候,情況就會變得不同。
var template =
'my skills:' +
'' +
'';var data =
var templateengine = function
(template, data)
現在需要理清楚我們的思路,我們拿到乙個模板,需要讓它裡面有定界符包裹的**能夠像js**一樣執行,最後返回給我們乙個包含了執行結果的字串,我們現在需要的就是實現
1. 建立乙個新陣列,將沒有定界符包裹的**部分放入陣列中
2. 分辨出js邏輯部分,也就是有定界符包裹的部分,取出,
3. 傳入data
這樣最後返回給我們的就是這樣乙個字串,
最終**如下:
var templateengine = function
(html, options) ))(.*)?/g,
code = 'var r=;\n',
cursor = 0;
var add = function
(line, js)
while(match = re.exec(html))
add(html.substr(cursor, html.length - cursor));
code += 'return r.join("");';
return
new}
可能很多人看不懂這個最終版本,下面我將把這個複雜版本簡單化,新增注釋,以便於理解:
var templateengine = function
(html, options) 等關鍵字
var reexp = /(^( )?(if|for|else|switch|case|break|))(.*)?/g;
//宣告乙個字串code,用來儲存我們最終輸出的結果
var code = 'var r=;\n';
//設定乙個游標,用來遍歷完我們傳入的整個模板字串
var cursor = 0;
//宣告乙個add函式,用來判斷是js指令碼部分,還是需要新增到陣列中的字串部分
var add = function
(line, js) else
}elseelse
}return add
}while( match = re.exec(html) )
var rest = html.substr(cursor, html.length - cursor);//匹配結束後,模板字串中最後剩餘的部分
add(rest);//這一部分也需要進入add函式中判斷
code = code + 'return r.join("");';//最後新增返回語句
code = code.replace(/[\r\t\n]/g, '');//去除code字串中的製表符,回車符和換行符等,使**看起來更加簡潔
return
new}
最終我們會獲得這樣乙個字串code,
利用js給我們提供了建構函式的「類」,
可以執行code
注意
這裡之所以會報錯,是因為console.log中新增的雙引號沒有加上轉義符(\),所以會報錯
完結:
寫完這篇部落格斷斷續續差不多用了兩天的時間,理解乙個東西不難,但是怎麼用文字說明白就很傷腦筋了,不過也算是前進了一小步啦。
參考部落格
Python(12)萌新也能看懂之 檔案讀寫
file open child.py r 開啟child.py檔案。第二個引數 r 表示以文字模式讀取。rb 表示以二進位制格式讀取,有些功能只能在二進位制格式時使用。除此之外,還有其他選項 引自菜鳥教程 模式 描述r以唯讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。rb以二進位制格式...
小白也能看懂的XML簡介
目錄 一.xml簡介 二 xml用途 三 xml結構 四 xml語法 五 xml元素 六 xml屬性 七 總結 1.xml指可擴充套件標記語言,很類似html。xml被設計為傳輸和儲存資料,其焦點是資料的內容 html被設計用來顯示資料,其焦點是資料的外觀。2.xml的設計宗旨是傳輸資料,而非顯示資...
小白也能看懂的Cookie跟Session的區別
首先為了能充分理解為什麼引入cookie和cookie是什麼,先看了例子。不然官網上定義的概念不太容易看懂。eg 我今天想找老王吃放,打 給老王 例子看完了,在看看一些官網上一些專業術語的定義。會話 由一組請求和響應組成 理解為上面例子中的 對話 是圍繞著一件相關事情 吃飯 所進行的請求和響應。這些...