JS模板工具lodash.template的简单用法

2019-12-05 17:13:40

参考地址 JS模板工具lodash.template的简单用法

lodash是从underscore分支的一个项目,之前我写了一篇JS模板工具underscore.template的简单用法,lodash跟underscore很相似,这也简单介绍一下lodash的template方法。

先把underscore的文章中用过的代码贴过来,把underscore的js文件换成lodash的js,其他一字不改,然后我们试试:

<!DOCTYPE html><html><head>
  <meta charset="utf-8"></head><body><div id="example1"></div><div id="example2"></div><script type="text/template" id="tpl1"><% _.each(datas, function (item) { %>    <div class="outer">
        <%= item.film %> - <%= item.url %> - <%= item.director %>    </div><% }); %></script><script type="text/template" id="tpl2"><% if ( 2 + 4 === 6 ) {
    _.each(datas, function (item) { %>        <div class="outer">
            <%= item.film %> - <%= item.url %> - <%= item.director %>        </div>
    <% });
} %></script><script src="http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script><script src="http://cdn.bootcss.com/lodash.js/4.16.6/lodash.min.js"></script><script type="text/javascript">var datas = [
    {
        film: '电影名称1',
        url: 'http://www.baidu.com',
        director: '导演名称1'
    },
    {
        film: '电影名称2',
        url: 'http://www.baidu.com',
        director: '导演名称2'
    },
    {
        film: '电影名称3',
        url: 'http://www.baidu.com',
        director: '导演名称4'
    },
    {
        film: '电影名称4',
        url: 'http://www.baidu.com',
        director: '导演名称4'
    },
];

$('#example1').html( _.template($('#tpl1').html(), datas) );
$('#example2').html( _.template($('#tpl2').html(), datas) );</script></body></html>

可以看到,正常打印了模板。

中文文档:http://www.css88.com/doc/lodash/#_templatestring-options

经过我的测试,lodash的运行效率比underscore的效率高一点点,这也符合业界对这两个库的评价,就是lodash比underscore高明一点点,所以以后尽量用lodash做模板引擎就好了。

用法可以参考中文文档,主要用法有两种:

第一种:

_.template('hello <%= user %>!')({ 'user': 'fred' })

第二种:

_.template('hello <%= user %>!', { 'user': 'fred' })

经过我的测试,第一种更快,所以大家以后尽量用第一种,而且官方示例全部是第一种写法。

掌握这一种写法,再掌握各种分隔符,就足够应对日常应用。

上面例子是以json直接量作为数据源,现在假设我们有一个json文件,我们应该怎么把数据插入到模板中?

先写HTML代码:

<div data-api="xxoourl"><script type="text/template">
                  <ol id="usersDaily" class="widget-top10">
                    <% _.each(daily,function(d){ %>                      <li class="text-muted">
                        <img class="avatar-24" src="<%- d.avatarUrl %>"/>
                        <a href="<%- d.url %>" class="ellipsis">
                          <%= d.name %>                        </a>
                        <span class="text-muted pull-right">+<%- d.incr %></span>
                      </li>
                    <% }) %>                  </ol>
                  <ol id="usersWeekly" class="widget-top10  hidden">
                    <% _.each(weekly,function(d){ %>                      <li class="text-muted">
                        <img class="avatar-24" src="<%- d.avatarUrl %>"/>
                        <a href="<%- d.url %>" class="ellipsis">
                          <%= d.name %>                        </a>
                        <span class="text-muted pull-right">+<%- d.incr %></span>
                      </li>
                    <% }) %>                  </ol></script></div>

也就是说,最外层div有一个data-api="xxoourl",用于指定源,里面是一个<script type="text/template"></script>,其中有两个循环,一个是循环daily,另一个是循环weekly。那么我们怎么组织这个json源?

在对象中设两个键,分别叫daily和weekly,每个键的值都是数组,数组的每个元素都是对象,每个对象就是一组数据。

{
      "daily": [
            {
                "rankWord": "11.8k",
                "avatarUrl": "https://sfault-avatar.b0.upaiyun.com/427/102/4271029182-55b7a3c57d25b_big64",
                "name": "eechen",
                "url": "/u/eechen",
                "incr": "79"
            },
            ...      ],
      "weekly": [
            {
                "rankWord": "1k",
                "avatarUrl": "https://sfault-avatar.b0.upaiyun.com/726/291/726291045-57fdead795d4e_big64",
                "name": "orangexc",
                "url": "/u/orange_1995",
                "incr": "198"
            },
            ...      ]}

然后是js代码:

var timestamp = new Date().getTime();$('[data-api]').each(function() {
    var $_self = $(this);
    $.get('/app/dev' + $_self.attr('data-api') + '?v=' + timestamp, function(data) {
        $_self.html( _.template($_self.find('script').html())(data) );
    }, 'json');});

这段的意思是遍历所有api容器,然后拉取源,将源解析成HTML代码,然后替换容器内的数据即可。这样也抹掉了模板。如果你不想抹掉模板,将$_self.html()改成$_self.append()即可。

总结:我们只要有容器、有源、有模板,就可以构建出一套HTML代码。




  • 2019-09-26 19:03:33

    spring post jackson的反序列化需要无参构造函数

    JSON parse error: Cannot construct instance of `com.**` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.**` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)  at [Source: (PushbackInputStream); line: 2, column: 2]] ———————————————— 版权声明:本文为CSDN博主「冰夏之夜影」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/u011561335/article/details/91346777

  • 2019-09-26 21:46:36

    Shiro整合JWT+Token过期刷新,demo,详解

    最近使用SpringBoot集成Shiro,JWT快速搭建了一个后台系统,Shiro前面已经使用过,JWT(JSON Web Tokens)是一种用于安全的传递信息而采用的一种标准。Web系统中,我们使用加密的Json来生成Token在服务端与客户端无状态传输,代替了之前常用的Session。 系统采用Redis作为缓存,解决Token过期更新的问题,同时集成SSO登录,完整过程这里来总结一下。

  • 2019-09-26 21:48:15

    解决UEditor超出最大字数后只提示不限制的问题

    最近项目用到百度额UEditor文本编辑器,今天测试向我提出了一个问题。就是在输入的文字超过默认的最大字数限制之后,虽然提示“字数超过最大范围,服务器可能拒绝保存”,但是仍然可以点击保存按钮进行保存。

  • 2019-09-27 14:49:33

    Google Guava介绍和体检

    JDK提供的String还不够好么?也许还不够友好,至少让我们用起来还不够爽,还得操心!举个栗子,比如String提供的split方法,我们得关心空字符串吧,还得考虑返回的结果中存在null元素吧,只提供了前后trim的方法(如果我想对中间元素进行trim呢)。

  • 2019-09-28 00:03:21

    shiro的session共享,持久化

     shiro的session创建与session的查询、更新、过期、删除中,shiro对session的操作基本都讲到了,但还缺一个session共享没有讲解;session共享的原理其实在自定义session管理一文已经讲过了,本文不讲原理,只看看shiro的session共享的实现。