js模板引擎渐进--if/else(7)
有了 each 的经验后,要实现 if/else 这种指令就简单了-------在 case '}' 处对 varcode 进行指令的判断即可。
模板代码:
{if data.value==1}<h3>11111111111</h3>{else-if data.value==2}<h3>22222222222</h3>{else}<h3>33333333333</h3>{/if}
目标代码:
function func(data) {var result = []; result.push(" ");if (data.value == 1) {result.push(" <h3>11111111111</h3> ");} else if (data.value == 2) {result.push(" <h3>22222222222</h3> ");} else {result.push(" <h3>33333333333</h3> ");} result.push(" ");return result.join("");}
分析:
>这里我们直接对照代码来看, 对于 if 和 else-if ,花括号 {} 内的内容,除了作为 指令识别字符 的 if/else-if 空格分隔后的第二个都是按照原样当作 js 代码来处理的。而不管是 if还是 else if 我们会发现 我们写js代码时,一般都会用 {} 将方法体抱起来(单行一般不需要包也可以,但是这里统一使用 {} 来包住方法体),而 if () 之后接的 就是 { 。
>对于 else/else-if 指令,通过代码我们看到, else 即代表 前一个情况的处理结束了, 那就需要 } 包回来,同时 else 说明了 另一个情况的开始,所以后面需要 加上 { 开始新的方法体。
>/if 跟 /each 一样,这里的 /if 代表这一层的判断结束,遇到 /if 时只需要 将方法体包回来 ,所以 提供 } 即可。
实现代码:
function Template2code(template) {var resultcode = [];resultcode.push("function func(data) { var result=[];");var tempcode = [];var varcode = [];var isvarcode = false;var eachIndex = 0;for (var key in template) {var value = template[key];//console.log(value);switch (value) {case "\n":if (isvarcode) {varcode.push(" ")}else {tempcode.push(" ");}break;case "\"":if (isvarcode) {varcode.push("\\\"")}else {tempcode.push("\\\"");}break;case "{":isvarcode = true;resultcode.push(" result.push(\"" + tempcode.join("") + "\") ;");tempcode = [];break;case "}":isvarcode = false;var varvalue = varcode.join("");if (varvalue.indexOf("each") == 0) {// each index,value arr var eachInfo = varvalue.split(' ');if (eachInfo.length != 3) throw "each 参数无效:each index,value arr";var itemInfo = eachInfo[1].split(',');if (itemInfo.length != 2) throw "each 参数无效:each index,value arr";resultcode.push("for (var " + itemInfo[0] + " in " + eachInfo[2] + ") {var " + itemInfo[1] + " = " + eachInfo[2] + "[" + itemInfo[0] + "];");}else if (varvalue === "/each") {resultcode.push(" }");}else if (varvalue.indexOf("if") == 0) {var ifInfo = varvalue.split(" ");resultcode.push("if(" + ifInfo[1] + "){");}else if (varvalue.indexOf("else-if") == 0) {var ifInfo = varvalue.split(" ");resultcode.push(" } else if(" + ifInfo[1] + "){");}else if (varvalue.indexOf("else") == 0) {var ifInfo = varvalue.split(" ");resultcode.push(" } else {");}else if (varvalue.indexOf("/if") == 0) {resultcode.push(" }");}else {resultcode.push(" result.push(" + varvalue + ") ;");}varcode = [];break;default:if (isvarcode) {varcode.push(value)}else {tempcode.push(value);}}}resultcode.push(" result.push(\"" + tempcode.join("") + "\") ;");resultcode.push("return result.join(\"\");}")return resultcode.join("");}
传入数据:
var data = {value: 3}
渲染结果:
<h3>33333333333</h3>
在 each 的基础上 处理 if 是简单很多了,这里也一篇就处理完了。
下一篇 处理 需要输出的内容里包含 {或者 } 的情况
目录:
js模板引擎渐进--前言
js模板引擎渐进--区别js代码和html字符串(1)
js模板引擎渐进--生成最简单的function(2)
js模板引擎渐进--区别js代码和html字符串2(3)
js模板引擎渐进--改进字符串拼接方式(4)
js模板引擎渐进--each/for(5)
js模板引擎渐进--each改进(6)
js模板引擎渐进--if/else(7)
js模板引擎渐进--处理需要输出 { 或者 } 的情况(8)
js模板引擎渐进--代码改进封装(9)
js模板引擎渐进--后记
js模板引擎渐进--if/else(7)相关推荐
- js模板引擎渐进--后记
至此,算是完成了一个系列了. 本来是想写的更详细的,但是太详细每次说的东西就少的可怜. 在学习的过程中,每次的改进改动博主都是复制一个新的文件进行,整个有二十多篇,中间有很多小细节的东西,集中在 ea ...
- js模板引擎art template数组渲染的方法
转载:js模板引擎art template数组渲染的方法 JavaScript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注,模板引擎种类也是五花八门,我就说几个安全性高.错误处理调 ...
- js模板引擎 之handlebars.js
最近在接触郑州知识库,里面使用到的技术是值得自己学习的. 该项目前端使用的是handlebars.js模板引擎框架.模板引擎框架用于数据与结构分离的思想,实现页面动态分离的效果. 1.为什么使用模板引 ...
- 解决laytpl.js模板引擎插件加载模板后无法获取模板中的元素id等内容
一.问题描述 在页面中使用laytpl.js模板引擎,在页面加载后无法使用jquery获取模板中的html元素,以下是图片和代码: 在添加或修改完毕后重新加载页面,不能使用jquery获取模板中的ht ...
- JS模板引擎sychelTemplate
sychelTemplate 简介 0.sychelTemplate希望创造一个用户觉得"简单好用"的JS模板引擎 注:等不及可以直接点左侧导航中的"C.使用举例&quo ...
- js模板引擎Nunjucks
js模板引擎Nunjucks Nunjucks中文文档
- 简单实用的js模板引擎
转自:微点阅读 https://www.weidianyuedu.com 不足50行的js模板引擎,支持各种js语法: <script id="test_list" typ ...
- doT.js 模板引擎的使用
dot.js是一个模板框架,在web前端使用. dot.js作为模板引擎, 主要的用途就是,在写好的模板上,放进数据,生成含有数据的html代码. 这是很简单的web前端模板框架, 简单说几个东西,你 ...
- JS模板引擎handlerbars入门
handlebars -- 前端的模板引擎 <!DOCTYPE html> <html lang="en"> <head><meta ...
最新文章
- 根据传入坐标和图片URL地址对图片进行切图操作、将图片转化成Base64位码
- MySQL8.0索引新特性:颠覆了我对索引的认知
- MYSQL || 的BUG // MYSQL 不同库自增id的问题 //MySQL根据表注释查找对应的表 //hive -mysql 日期比较
- MySQL中的数据查询
- 创造信用收入 借贷宝颠覆创新普惠金融
- VS2013找不到winres.h的解决办法
- 0101代码构成了计算机语言,计算机(全国一级考试)理论复习要点、模拟题.doc
- Win7系统局域网抢网速的方法
- 以厘php框架 v10.6.8
- dell电脑计算机专业,戴尔Dell专用英语_电脑基础知识_IT计算机_专业资料.doc
- 计算机系统-记录Bochs调试器几个常用命令
- ------更快的搜索储存结构-----平衡二叉树-----------------
- Java基础学习(4)-动态代理
- Atitit 架构师的技术框架体系图 各种引擎列表 脚本引擎 groovy beanshel php nodejs rhino等 表达式引擎技术 Ognl/MVELl等 通讯, rest 命令解
- 2、idea热部署插件JRebel+2020年Jrebel激活码+Springboot web开发+Springboot配置文件详解+thymeleaf模板引擎的使用【Springboot】
- 大功率H桥电机驱动板电路设计方案 此大功率直流电机驱动板采用ir2103驱动芯片
- 大连开发区中老年运动微信群_大连跑步微信群
- iOS GitHub上常用第三方框架与一些参考文本总结
- Android打开自启动设置页面
- ubuntu挂载raid硬盘_Ubuntu服务器挂载新硬盘的步骤
热门文章
- 【无标题】民法典后离婚协议范本
- Luminar Neo 教程,如何在 Luminar Neo 中共享自定义预设?
- 可枚举属性和不可枚举属性(for...in循环和Objec.keys()和Object.getOwnPropertyNames())
- 计算机绘图自考知识点,计算机绘图(电子CAD)自考大纲-08年9月.doc
- 古剑奇谭网络版服务器正在维护,古剑奇谭ol11月29日更新了什么 古剑网络版更新维护公告...
- 我的梦想是当一个计算机英语,my dream(我的梦想)英语作文带翻译
- 华为WATCH Buds耳机升级失败的解决方案
- 一起重新开始学大数据-java篇-DAY01-第一个java代码helloworld
- C语言输入一个字符串并逆序输出同时输出大写字母的数量
- 上班摸鱼的时候可以做什么