冒险岛官网模拟之六利用模板引擎art-template渲染页面以及art-template语法介绍

首先介绍我们的主角:
下载地址:https://github.com/aui/art-template
模板引擎插件(art-template),它的官方介绍是:拥有接近 JavaScript 渲染极限的的性能.今天我们就用它来渲染我们网页的部分内容.

需要渲染的部分:
这里写图片描述

这里面的页面结构极其相似,所以我们利用模板可以生成.

接着,我们介绍模板的使用语法:

art-template 支持标准语法与原始语法。标准语法可以让模板易读写,而原始语法拥有强大的逻辑表达能力。

标准语法支持基本模板语法以及基本 JavaScript 表达式;原始语法支持任意 JavaScript 语句,这和 EJS 一样。

输出语法:

//标准语法输出字符串
<td class="text-center">{{@ "已发布" }}</td>

//原始语法输出字符串
<td class="text-center"><%= "已发布" %></td>

//输出字符串时要加双引号,否则会当成变量来解析

分支结构的语法:

//标准语法

{{ if value.status == "published"  }}
        <td class="text-center">{{@ "已发布" }}</td>
{{ else value.status == "drafted" }}
        <td class="text-center">{{@ "草稿" }}</td>
{{ /if }}

//原始语法:
<% if (value.status == "published") { %>   
        <td class="text-center">{{@ "已发布" }}</td>
<% } else(value.status == "drafted") { %>
        <td class="text-center">{{@ "草稿" }}</td>
<% } %>

//原始语法与JS的原生语法很像,只不过多了一对<% %>

循环分支:

//标准语法的循环

{{ each list value key }}
    <tr>
      <td class="text-center"><input type="checkbox" index="{{value.id}}"></td>
      <td>{{ value.name }}</td>
      <td>{{ value.slug }}</td>
      <td class="text-center">
        <a href="javascript:void(0);" onclick="editorCategory({{ value.id }})" class="btn btn-info btn-xs">编辑</a>
        <a href="javascript:void(0);" onclick="deleteCategory({{ value.id }})" class="btn btn-danger btn-xs">删除</a>
      </td>
    </tr>
  {{ /each }}

//注意标准语法的里面的循环:
//1.如果遍历的是数组value与key代表一个是数组里的元素,一个是下标.
//2.如果遍历的是对象value与key代表一个是对象里的属性值,一个是属性名.
//3.list这个名字可以随便取,也可以叫target,只需要到时候在调用模板的时候,与之对应就可以了.


//原始语法:

<% for(var i =0;i < list.length;i++) { %>
    <tr>
      <td class="text-center"><input type="checkbox" index="{{value.id}}"></td>
      <td>{{ value.name }}</td>
      <td>{{ value.slug }}</td>
      <td class="text-center">
        <a href="javascript:void(0);" onclick="editorCategory({{ value.id }})" class="btn btn-info btn-xs">编辑</a>
        <a href="javascript:void(0);" onclick="deleteCategory({{ value.id }})" class="btn btn-danger btn-xs">删除</a>
      </td>
    </tr>
<% } %>

**//我们发现原始语法与标准语法可以共用,前提是语法书写正确**

至于其他的语法,可以去其官网上查阅文档.

模板使用的方法::
第一,导入模板:

<!-- 1.引入模板引擎 -->
<script src="./JS/template-web.js"></script>

第二步:准备需要结构类似需要重复生成的模板

<!-- 2.准备模板 -->
<script type="text/html" id="tpl1">
    //这里写需要生成的模板
</script>

第三步:调用模板的api来渲染模板到页面上

//引用模板,模板生成的内容在变量名ul的内存里面
    var ul = template('tpl1',{ list : 6});

//需要我们追加到页面上去
    document.getElementById('newBd').innerHTML = ul;
/*
    这里需要注意的是,调用api来生成的ul里面包含了需要生成模板里的
    所有内容,但是ul作为一个变量,只是将这些值保存在自己的内存里,
    并没有被解析出来;所以我们又利用innerHTML可以解析标签的功能将
    标签解析出来渲染到页面上
*/

ul里面存放的内容(包含标签)
这里写图片描述
我们可以看到ul里面存放的是一个带有标签的字符串.

模板需要注意的地方:(很重要)

因为模板是在页面上的其他元素加载完成之后,才开始加载的,所以一开始页面上没有模板里面的标签,它是后面用引擎渲染上去的.

所有在操作模板里面的标签元素时,我们应该利用事件的注册或则行内事件的方法.
比如:

 {{ each list value key }}
    <tr>
      <td class="text-center"><input type="checkbox" index="{{value.id}}"></td>
      <td>{{ value.name }}</td>
      <td>{{ value.slug }}</td>
      <td class="text-center">
        <a href="javascript:void(0);" onclick="editorCategory({{ value.id }})" class="btn btn-info btn-xs">编辑</a>
        <a href="javascript:void(0);" onclick="deleteCategory({{ value.id }})" class="btn btn-danger btn-xs">删除</a>
      </td>
    </tr>
  {{ /each }}

冒险岛2具体实现代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="./Css/index.css">
    <style>
        .hot-news a {
            position: absolute;
        }
    </style>
</head>
<body>
    <div class="main-area-l">
        <div class="news-box">
            <div class="news-type-box" id="newsBox">
                <div class="news-type-hd clearfix">
                    <div id="newsHd" class="news-type-a cf">
                        <a href="javascript:void(0);" class="" target="_blank">全部</a>
                        <a href="javascript:void(0);" target="_blank" class="">新闻</a>
                        <a href="javascript:void(0);" target="_blank" class="">公告</a>
                        <a href="javascript:void(0);" target="_blank" class="">活动</a>
                        <a href="javascript:void(0);" target="_blank" class="">媒体</a>
                        <a href="javascript:void(0);" target="_blank" class="">玩家</a>
                        <a href="javascript:void(0);" target="_blank" class="active">攻略</a>
                        <span class="tab-arr-line" style="left: 330px;"></span>
                    </div>
                    <a href="#" class="more-link" target="_blank">+</a>
                </div>
                <div class="news-type-bd">

                    <div id="newBd" class="news-type-cont">
                        <-- 这里就是模板生成后的内容区域 -->
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>

<!-- 1.引入模板引擎 -->
<script src="./jquery-1.12.4.js"></script>
<script src="./JS/template-web.js"></script>


<!-- 2.准备模板 -->
<script type="text/html" id="tpl1">
    <% for(var i=1;i<=list;i++){ %>

        <!-- 默认让第一个显示,其他的都不显示 -->
        {{  if i == 1 }} 
            <!-- 给每一个ul一个点击事件 -->
            <ul class="news-list" style="display: block;"  id="{{@ "ul" }}{{ i }}">
        {{ else  }}
            <ul class="news-list" style="display: none;"  id="{{@ "ul" }}{{ i }}">   
        {{ /if }}
        <li>
            <span class="news-icon "></span>
            <!-- 为了便于区分这里我们这一个i的输出让内容 -->
            <a href="#" target="_blank" class="news-txt">【活动】{{@ "这是第" }}{{@  i   }}{{@ "个ul标签" }}</a>
            <span class="news-time">08/07</span>
        </li>
        <li>
            <span class="news-icon "></span>
            <a href="#" target="_blank" class="news-txt">【活动】暑月蝉鸣礼包限量购 含大量祝福之石机会难得</a>
            <span class="news-time">08/07</span>
        </li>
        <li>
            <span class="news-icon "></span>
            <a href="#" target="_blank" class="news-txt">【重要】公测版本更新内容及注意事项汇总</a>
            <span class="news-time">08/07</span>
        </li>
        <li>
            <span class="news-icon "></span>
            <a href="#" target="_blank" class="news-txt">冒险岛2觉醒公测调研问卷-领奖通知</a>
            <span class="news-time">08/07</span>
        </li>
        <li>
            <span class="news-icon "></span>
            <a href="#" target="_blank" class="news-txt">【活动】冒险家回归计划 欢迎回家!</a>
            <span class="news-time">08/07</span>
        </li>
        <li>
            <span class="news-icon "></span>
            <a href="#" target="_blank" class="news-txt">【活动】邀请好友一起冒险!</a>
            <span class="news-time">08/07</span>
        </li>
        <li>
            <span class="news-icon "></span>
            <a href="#" target="_blank" class="news-txt">【活动】七夕岛上大冒险 鹊桥来相会</a>
            <span class="news-time">08/07</span>
        </li>
    </ul>
    <% } %>
</script>

<!-- 3.调用api来渲染模板页面 -->
<script>

    //引用模板
    var ul = template('tpl1',{ list : 6});

    document.getElementById('newBd').innerHTML = ul;

    //给每个模板顶部的导航点击事件
    $("#newsHd a").on('click',function(){

        //设置对应的颜色更改
        $(this).addClass('active').siblings('a').removeClass('active');
        //设置下方对应的span的移动
        $('.tab-arr-line').css('left',$(this).position().left + 'px');

        //让下方显示的盒子与我的导航栏一致
        var idx = $(this).index();
        $('.news-list').eq(idx).show().siblings('.news-list').hide();

    });

</script>

猜你喜欢

转载自blog.csdn.net/weixin_42839080/article/details/82527533