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




  • 2017-03-22 14:00:51

    Andriod Studio结合Visual Studio Emulator for Android调试Android App

    说到开发就绕不开调试程序,调试Android App我们有2种选择,真机调试和模拟器调试:真机调试相对简单,就不做介绍了,还有一方面原因是由于安卓手机一旦插到电脑上,开始ADB调试后,各种的流氓软件净是往手机上装垃圾应用,妈蛋的;随后就试了几次Android Studio的模拟器之后,无限感慨,真尼玛的卡,卡,卡,,,是可忍孰不可忍.....

  • 2017-03-22 16:26:36

    最全面的Android Webview详解

    现在很多App里都内置了Web网页(Hyprid App),比如说很多电商平台,淘宝、京东、聚划算等等,如下图

  • 2017-03-23 22:29:52

    Android开发中Handler的经典总结

    当应用程序启动时,Android首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI控件,进行事件分发。

  • 2017-03-27 16:24:26

    laravel,gulp,Browsersync浏览器同步测试

    Browsersync能让浏览器实时、快速响应您的文件更改(html、js、css、sass、less等)并自动刷新页面。更重要的是 Browsersync可以同时在PC、平板、手机等设备下进项调试。您可以想象一下:“假设您的桌子上有pc、ipad、iphone、android等设备,同时打开了您需要调试的页面,当您使用browsersync后,您的任何一次代码保存,以上的设备都会同时显示您的改动”。无论您是前端还是后端工程师,使用它将提高您30%的工作效率。

  • 2017-03-28 09:27:41

    Java中Arrays的asList()方法

    Java中Arrays的asList()方法 可以将 数组转为List 但是,这个数组类型必须是 引用类型的,如果是8中基本数据类型就不可以 原因如下,引用别人的一篇文章: