当前位置:首页 » 《休闲阅读》 » 正文

handlebars.js使用:用ajax渲染内容到前端

5 人参与  2024年10月27日 08:40  分类 : 《休闲阅读》  评论

点击全文阅读


背景:之前写前后端不分离的项目,都是通过ThinkTemplate(thinkphp)和Thymeleaf、FreeMarker(Java)去实现的,但是有些数据需要动态去体现使用过ajax去手动操作dom通常有点麻烦,偶然间知道这个js模板还是蛮感兴趣,功能强大。

文章目录

一、Handlebars.js是什么?

二、使用步骤(each-基本循环使用方法)

三、进阶

总结


前言

        小弟之前愚蠢的想法就是ajax请求的话都是一个一个去添加,每一块内容先拼接好一整块,然后再循环输出。(这里指ajax请求的情况下,其他情况下不分离模板直接for很快的)

        直到今天,遇到了handlebars.js

        handlebars.js可以在提前设置好的模板内渲染出内容,功能强大下面演示


提示:以下是本篇文章正文内容,下面案例可供参考

一、Handlebars.js是什么?

        Handlebars.js是一个Javascript客户端的模板引擎(它也能用于服务器端)。它是一个Javascript库,就像你在页面中包含其他.js文件一样。有了它,在你的HTML页面内添加模板,模板会被你通过Handlebars.js函数传递的数据中的值解析或者插值。

二、使用步骤(each-基本循环使用方法)

1.设置模板

代码如下:

html:

<body>    <script id="template" type="text/x-handlebars-template">        <ul>            {{#each items}}                <li>{{this.name}} - {{this.value}}</li>            {{/each}}        </ul>    </script>    <div id="result"></div>    <a href="javascript:;" onclick="ceshi()">测试</a>    <a href="javascript:;" onclick="xuanran()">渲染</a></body>

template就是我们设置好的模板,相当于你设置好了一个商品展示卡(我上面的图)

2.Ajax获取数据

代码如下:

Javascript:

<script>function ceshi(){    $.ajax({        type: "GET",        url: "",        success: function(e) {            console.log(e)        },        error: function() {            console.log('失败')        }    })};function xuanran(){    $.ajax({        url: '',        method: 'GET',        success: function(data) {            var source = $('#template').html();            var template = Handlebars.compile(source);            var html = template({ items: data.data });            console.log(html);            $('#result').html(html);        }    });};</script>

这里是利用Ajax去请求后端获取数据。

这里可以看出,数据是从这边传进去的:

template({ items: data.data });

3.后端提供数据

public function test()    {        $a = [            ['name' => '名字','value'   =>  '小明'],            ['name' => '年龄','value'   =>  '18'],            ['name' => '性别','value'   =>  '男'],            ['name' => '身高','value'   =>  '181'],            ['name' => '体重','value'   =>  '70kg'],        ];        if(false === $this->request->isAjax())        {            return view();        }        return api($a,200,'请求成功');            }

这里是测试数据故意弄成这样子

这种数据格式也是经常见吧,不像常规的很好认的那种

效果

点击获取数据后就会渲染。

分析

你得到数据之后,他是这样的

//这个jsvar html = template({ items: data.data });//说明你已经拿到这样的数据了"data": [        {            "name": "名字",            "value": "小明"        },        {            "name": "年龄",            "value": "18"        },        {            "name": "性别",            "value": "男"        },        {            "name": "身高",            "value": "181"        },        {            "name": "体重",            "value": "70kg"        }    ]//然后这边#each表示进入{{#each items}}//说明到达每一块{     "name": "名字",     "value": "小明"}//这里你就只能用{{this.name}} - {{this.value}}//这种模板还是很可以

三、进阶

这样我们就可以做更复杂的操作了

each-基本循环使用方法

前端:

<body>    <h1>each-基本循环使用方法</h1>    <!--基础html框架-->    <table>        <thead>            <tr>                <th>姓名</th>                <th>性别</th>                <th>年龄</th>            </tr>        </thead>        <tbody id="tableList">        </tbody>    </table>    <!--id可以用来唯一确定一个模版,type是模版固定的写法-->    <script id="table-template" type="text/x-handlebars-template">        {{#each student}}        <tr>            <td>{{name}}</td>            <td>{{sex}}</td>            <td>{{age}}</td>        </tr>        {{/each}}    </script></body>
    <!--进行数据处理、html构造-->    <script type="text/javascript">        $(document).ready(function () {            $.ajax({                url:'student',                method:'GET',                success:function(data){                var myTemplate = Handlebars.compile($("#table-template").html());                //将json对象用刚刚注册的Handlebars模版封装,得到最终的html,插入到基础table中。                $('#tableList').html(myTemplate(data.data));                }            });        });    </script>

后端:

public function test1()    {        if(false === $this->request->isAjax())        {            return view();        }    }public function student()    {        $student    =   [            [                'name'  => "张三",                'sex'   => "男",                'age'   => 28            ],            [                'name'  => "李四",                'sex'   => "女",                'age'   => 30            ],            [                'name'  => "妞妞",                'sex'   => "女",                'age'   => 32            ]        ];        return api(['student'=>$student],200,'请求成功');    }

应该很好分析这个是干嘛的

with-进入到某个属性(进入到某个上下文环境)

分析:

首先来构造一个复杂的json(工作中经常遇到的,给前端小姐姐上点压力)

先给大家看看前端的页面加载出来是没有数据的

等到数据出来时,他才开始渲染出来:(其实这一直是我想要的,用vue或者其他也能达到这种效果,但是还是喜欢有些杂糅在一起的)

代码如下:

前端:

<body>       <h1>with-进入到某个属性(进入到某个上下文环境)</h1>        <!--基础html框架-->       <table>        <thead>            <tr>                <th>姓名</th>                <th>性别</th>                <th>年龄</th>                <th>兴趣爱好</th>            </tr>        </thead>        <tbody id="tableList">        </tbody>    </table>     <!--Handlebars.js模版放在script标签中,保留了html原有层次结构,模版中要写一些操作语句-->  <!--id可以用来唯一确定一个模版,type是模版固定的写法-->    <script id="table-template" type="text/x-handlebars-template">      {{#each this}}        <tr>            <td>{{name}}</td>            <td>{{sex}}</td>            <td>{{age}}</td>            <td>                 {{#with favorite}}                    {{#each this}}                        <p>{{name}}</p>                    {{/each}}                 {{/with}}            </td>        </tr>        {{/each}}    </script></body>
    <!--进行数据处理、html构造-->    <script type="text/javascript">       $(document).ready(function() {        $.ajax({                url:'test2api',                method:'GET',                success:function(data){                //$("#table-template").html()是jquery的语法。。。                var myTemplate = Handlebars.compile($("#table-template").html());                //将json对象用刚刚注册的Handlebars模版封装,得到最终的html,插入到基础table中。                $('#tableList').html(myTemplate(data.data.student));                }            });     });  </script>

后端:

    public function test2()    {        if(false === $this->request->isAjax())        {            return view();        }    }    public function test2api()    {        $student  =   [            [                'name'  => "张三丰",                'sex'   => "男",                'age'   => 28,                'favorite'  =>[                    ['name' =>  "唱歌"],                    ['name' =>  "篮球"]                ]            ],            [                'name'  => "李妮妮",                'sex'   => "女",                'age'   => 30,                'favorite'  =>[                    ['name' =>  "上网"],                    ['name' =>  "足球"]                ]            ],            [                'name'  => "王妞妞",                'sex'   => "女",                'age'   => 18,                'favorite'  =>[                    ['name' =>  "电影"],                    ['name' =>  "旅游"]                ]            ]        ];        return api(['student'=>$student],200,'请求成功');    }

这个老哥写的好,可以参考他的,我也是参考他的:JavaScript页面模版引擎handlebars.js学习及使用_handlebars.js for-CSDN博客

对了我这tp8写的返回json的函数是这个:

function api($data, $code = 200, $msg = 'Success'){    $result = [        'code' => $code,        'message' => $msg,        'data' => $data,    ];    return json($result);}

放在公共函数那边


总结

Ajax渲染页面的很早就想用找不到方便的,奈何本身就懒得写dom(我很菜),找到这个可以做很多事。

有的时候咱页面又不想被扒下来,就可以用这种方式

1.在Ajax请求的时候加个加个参数:域名还是其他加密起来,传过去参数(域名)不对,就得不到数据了,跨域也给它开上。

var domain = document.domain;$.ajax({        url: '/xxxxx?domain='+domain,        method: 'GET',        success: function(data) {            var source = $('#template').html();            var template = Handlebars.compile(source);            var html = template({ items: data.data });            console.log(html);            $('#result').html(html);        }    });

2.把F12禁用掉,不要让他看到咱返回的数据结构。


点击全文阅读


本文链接:http://zhangshiyu.com/post/178394.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1