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

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

17 人参与  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://m.zhangshiyu.com/post/178394.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

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

最新文章

  • 进错房,嫁给八零最牛特种兵已完结(林晚夏江肆年)抖音热文_《进错房,嫁给八零最牛特种兵已完结》最新章节免费在线阅读 -
  • 重生后选魔族,天族哭着求我当王全章节(月沁雪任意)全文免费阅读无弹窗大结局_(重生后选魔族,天族哭着求我当王全章节)重生后选魔族,天族哭着求我当王全章节免费阅读全文最新章节列表_笔趣阁(重生后选魔族,天族哭着求我当王全章节) -
  • 捡回摄政王后,她在皇室作威作福完结版小说(景飞鸢赵灵杰)全文免费阅读无弹窗大结局_(捡回摄政王后,她在皇室作威作福完结版免费阅读全文大结局)最新章节列表_笔趣阁(捡回摄政王后,她在皇室作威作福完结版) -
  • 千金难泣(立轩苏子骞翠竹吴进)全本免费在线阅读_千金难泣最新章节在线阅读(立轩苏子骞翠竹吴进)
  • 《沈云阶傅宴辞》(沈云阶傅宴辞》已完结完整版全集大结局小说)全文阅读笔趣阁
  • 《沈凌峰沈国华》已完结小说全文阅读笔趣阁《沈凌峰沈国华》
  • 《傅嫤韩恬魏郯程茂》已完结(傅嫤韩恬魏郯程茂)热门小说全目录完整版)全文阅读笔趣阁
  • 八零俏军医错嫁糙汉军官:番外+全文+后续(贺昭朗孟翩然)完本小说免费_全本免费小说八零俏军医错嫁糙汉军官:番外+全文+后续最新小说全文阅读(贺昭朗孟翩然)
  • 失去千千万万遍在线阅读(阮相宜陆凛言)全文免费阅读无弹窗大结局_(失去千千万万遍在线阅读)失去千千万万遍在线阅读免费阅读全文最新章节列表_笔趣阁(失去千千万万遍在线阅读) -
  • 脱离世界后,妻子疯了火爆小说小说(沈夕颜林程言)全文免费阅读无弹窗大结局_(脱离世界后,妻子疯了火爆小说免费阅读全文大结局)最新章节列表_笔趣阁(脱离世界后,妻子疯了火爆小说) -
  • 跨年发生踩踏,男友为救白月光丢下我(温林初宝宝)免费阅读 -
  • 都重生了,还不离婚等啥呢宋招弟霍文铮小说在线章节免费阅读

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

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