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代码。




  • 2020-01-08 23:37:08

    laravel通过图片流返回图片

    我用laravel的字母头像生成框架Laravolt\Avatar生成的base64头像,但我想做个通用但,直接返回图片,我还是根据以往但经验 改写header但返回值为图片返回值,结果返回失败,一堆乱吗,不知道为啥。 后来用了laravel自带但返回图片但方法,结果ok。记录下

  • 2020-01-08 23:45:06

    laravel response 对象一些常用功能点

    通常,我们并不只是从路由动作简单返回字符串和数组,大多数情况下,都会返回一个完整的 Illuminate\Http\Response 实例或 视图。

  • 2020-01-08 23:49:13

    laravel 存储base64格式图片

    一、总结 一句话总结: 二、laravel存储64位图片实例 三、laravel 存储前端上传base64图片 四、php将base64字符串转换为图片

  • 2020-01-09 01:24:28

    mac安装ImageMagick与PHP扩展Imagick

    mac安装ImageMagick和php7.2扩展Imagick,从网上搜索教程,感觉好少,有的教程看起来也很麻烦,不过安装起来,没想到竟然如此简单。不非纯灰之力。

  • 2020-01-09 18:49:17

    pecl安装卸载模块,如何自动配置php.ini

    利用pecl安装php模块,可能需要手工配置php.ini,以加载或禁止相关模块。那么pecl install是不是可以自动配置php.ini呢?答案是肯定的。在pecl isntall的提示信息中,苏南大叔找到了下面的类似提示信息:configuration option "php_ini" is not set to php.ini location。这个设置点,就是本文的关键所在。设置好"php_ini"之后,pecl就可以自动修改php.ini中的extension=了。

  • 2020-01-10 10:23:08

    父元素设置min-height子元素设置100%问题

    父元素设置min-height子元素高度设置100%取不到值,这是因为子元素 div设置 height:100%;只有当父级元素满足min-height:1000px;设置的条件才触发;浏览器默认是不会触发的,所以子元素的100%的高度继承就失效了。min-height 是在 height 计算之后再套用的.

  • 2020-01-10 15:48:46

    Linux下查看文件精确到秒的修改时间

    今天排查一个BUG遇到一个问题,错误日志中打印的时间精确到秒,但当根据日志中的时间去找对应文件进行验证的时候,发现通过 ls -l 或者 ll 命令,都无法查看到文件精确到秒的修改时间。

  • 2020-01-10 15:55:05

    linux php yum 安装Imagick

    通过pecl安装Imagick扩展,成功到是成功了,很顺利,但是so包并不在我当年用yum安装的php7.2的扩展包内,我把生成的Imagick.so,移动到当前用的php包内,并不能用,提示 undefined symbol: spl_ce_Countable)) in Unknown on line 0。