有了 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)相关推荐

  1. js模板引擎渐进--后记

    至此,算是完成了一个系列了. 本来是想写的更详细的,但是太详细每次说的东西就少的可怜. 在学习的过程中,每次的改进改动博主都是复制一个新的文件进行,整个有二十多篇,中间有很多小细节的东西,集中在 ea ...

  2. js模板引擎art template数组渲染的方法

    转载:js模板引擎art template数组渲染的方法 JavaScript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注,模板引擎种类也是五花八门,我就说几个安全性高.错误处理调 ...

  3. js模板引擎 之handlebars.js

    最近在接触郑州知识库,里面使用到的技术是值得自己学习的. 该项目前端使用的是handlebars.js模板引擎框架.模板引擎框架用于数据与结构分离的思想,实现页面动态分离的效果. 1.为什么使用模板引 ...

  4. 解决laytpl.js模板引擎插件加载模板后无法获取模板中的元素id等内容

    一.问题描述 在页面中使用laytpl.js模板引擎,在页面加载后无法使用jquery获取模板中的html元素,以下是图片和代码: 在添加或修改完毕后重新加载页面,不能使用jquery获取模板中的ht ...

  5. JS模板引擎sychelTemplate

    sychelTemplate 简介 0.sychelTemplate希望创造一个用户觉得"简单好用"的JS模板引擎 注:等不及可以直接点左侧导航中的"C.使用举例&quo ...

  6. js模板引擎Nunjucks

    js模板引擎Nunjucks Nunjucks中文文档

  7. 简单实用的js模板引擎

    转自:微点阅读  https://www.weidianyuedu.com 不足50行的js模板引擎,支持各种js语法: <script id="test_list" typ ...

  8. doT.js 模板引擎的使用

    dot.js是一个模板框架,在web前端使用. dot.js作为模板引擎, 主要的用途就是,在写好的模板上,放进数据,生成含有数据的html代码. 这是很简单的web前端模板框架, 简单说几个东西,你 ...

  9. JS模板引擎handlerbars入门

    handlebars   -- 前端的模板引擎 <!DOCTYPE html> <html lang="en"> <head><meta ...

最新文章

  1. 根据传入坐标和图片URL地址对图片进行切图操作、将图片转化成Base64位码
  2. MySQL8.0索引新特性:颠覆了我对索引的认知
  3. MYSQL || 的BUG // MYSQL 不同库自增id的问题 //MySQL根据表注释查找对应的表 //hive -mysql 日期比较
  4. MySQL中的数据查询
  5. 创造信用收入 借贷宝颠覆创新普惠金融
  6. VS2013找不到winres.h的解决办法
  7. 0101代码构成了计算机语言,计算机(全国一级考试)理论复习要点、模拟题.doc
  8. Win7系统局域网抢网速的方法
  9. 以厘php框架 v10.6.8
  10. dell电脑计算机专业,戴尔Dell专用英语_电脑基础知识_IT计算机_专业资料.doc
  11. 计算机系统-记录Bochs调试器几个常用命令
  12. ------更快的搜索储存结构-----平衡二叉树-----------------
  13. Java基础学习(4)-动态代理
  14. Atitit 架构师的技术框架体系图 各种引擎列表 脚本引擎 groovy beanshel php nodejs rhino等 表达式引擎技术 Ognl/MVELl等 通讯, rest 命令解
  15. 2、idea热部署插件JRebel+2020年Jrebel激活码+Springboot web开发+Springboot配置文件详解+thymeleaf模板引擎的使用【Springboot】
  16. 大功率H桥电机驱动板电路设计方案 此大功率直流电机驱动板采用ir2103驱动芯片
  17. 大连开发区中老年运动微信群_大连跑步微信群
  18. iOS GitHub上常用第三方框架与一些参考文本总结
  19. Android打开自启动设置页面
  20. ubuntu挂载raid硬盘_Ubuntu服务器挂载新硬盘的步骤

热门文章

  1. 【无标题】民法典后离婚协议范本
  2. Luminar Neo 教程,如何在 Luminar Neo 中共享自定义预设?
  3. 可枚举属性和不可枚举属性(for...in循环和Objec.keys()和Object.getOwnPropertyNames())
  4. 计算机绘图自考知识点,计算机绘图(电子CAD)自考大纲-08年9月.doc
  5. 古剑奇谭网络版服务器正在维护,古剑奇谭ol11月29日更新了什么 古剑网络版更新维护公告...
  6. 我的梦想是当一个计算机英语,my dream(我的梦想)英语作文带翻译
  7. 华为WATCH Buds耳机升级失败的解决方案
  8. 一起重新开始学大数据-java篇-DAY01-第一个java代码helloworld
  9. C语言输入一个字符串并逆序输出同时输出大写字母的数量
  10. 上班摸鱼的时候可以做什么