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

打印 上一主题 下一主题

主题 908|帖子 908|积分 2724

背景:之前写前后端不分离的项目,都是通过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:
  1. <body>
  2.     <script id="template" type="text/x-handlebars-template">
  3.         <ul>
  4.             {{#each items}}
  5.                 <li>{{this.name}} - {{this.value}}</li>
  6.             {{/each}}
  7.         </ul>
  8.     </script>
  9.     <div id="result"></div>
  10.     <a href="javascript:;" onclick="ceshi()">测试</a>
  11.     <a href="javascript:;" onclick="xuanran()">渲染</a>
  12. </body>
复制代码
template就是我们设置好的模板,相当于你设置好了一个商品展示卡(我上面的图)

2.Ajax获取数据

代码如下:
Javascript:
  1. <script>
  2. function ceshi(){
  3.     $.ajax({
  4.         type: "GET",
  5.         url: "",
  6.         success: function(e) {
  7.             console.log(e)
  8.         },
  9.         error: function() {
  10.             console.log('失败')
  11.         }
  12.     })
  13. };
  14. function xuanran(){
  15.     $.ajax({
  16.         url: '',
  17.         method: 'GET',
  18.         success: function(data) {
  19.             var source = $('#template').html();
  20.             var template = Handlebars.compile(source);
  21.             var html = template({ items: data.data });
  22.             console.log(html);
  23.             $('#result').html(html);
  24.         }
  25.     });
  26. };
  27. </script>
复制代码
这里是利用Ajax去请求后端获取数据。
这里可以看出,数据是从这边传进去的:
  1. template({ items: data.data });
复制代码

3.后端提供数据

  1. public function test()
  2.     {
  3.         $a = [
  4.             ['name' => '名字','value'   =>  '小明'],
  5.             ['name' => '年龄','value'   =>  '18'],
  6.             ['name' => '性别','value'   =>  '男'],
  7.             ['name' => '身高','value'   =>  '181'],
  8.             ['name' => '体重','value'   =>  '70kg'],
  9.         ];
  10.         if(false === $this->request->isAjax())
  11.         {
  12.             return view();
  13.         }
  14.         return api($a,200,'请求成功');
  15.         
  16.     }
复制代码
这里是测试数据故意弄成如许子
这种数据格式也是经常见吧,不像通例的很好认的那种
结果


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



分析

你得到数据之后,他是如许的

  1. //这个js
  2. var html = template({ items: data.data });
  3. //说明你已经拿到这样的数据了
  4. "data": [
  5.         {
  6.             "name": "名字",
  7.             "value": "小明"
  8.         },
  9.         {
  10.             "name": "年龄",
  11.             "value": "18"
  12.         },
  13.         {
  14.             "name": "性别",
  15.             "value": "男"
  16.         },
  17.         {
  18.             "name": "身高",
  19.             "value": "181"
  20.         },
  21.         {
  22.             "name": "体重",
  23.             "value": "70kg"
  24.         }
  25.     ]
  26. //然后这边#each表示进入
  27. {{#each items}}
  28. //说明到达每一块
  29. {
  30.      "name": "名字",
  31.      "value": "小明"
  32. }
  33. //这里你就只能用
  34. {{this.name}} - {{this.value}}
  35. //这种模板还是很可以
复制代码

三、进阶

如许我们就可以做更复杂的操作了
each-基本循环使用方法



前端:

  1. <body>
  2.     <h1>each-基本循环使用方法</h1>
  3.     <!--基础html框架-->
  4.     <table>
  5.         <thead>
  6.             <tr>
  7.                 <th>姓名</th>
  8.                 <th>性别</th>
  9.                 <th>年龄</th>
  10.             </tr>
  11.         </thead>
  12.         <tbody id="tableList">
  13.         </tbody>
  14.     </table>
  15.     <!--id可以用来唯一确定一个模版,type是模版固定的写法-->
  16.     <script id="table-template" type="text/x-handlebars-template">
  17.         {{#each student}}
  18.         <tr>
  19.             <td>{{name}}</td>
  20.             <td>{{sex}}</td>
  21.             <td>{{age}}</td>
  22.         </tr>
  23.         {{/each}}
  24.     </script>
  25. </body>
复制代码
  1.     <!--进行数据处理、html构造-->
  2.     <script type="text/javascript">
  3.         $(document).ready(function () {
  4.             $.ajax({
  5.                 url:'student',
  6.                 method:'GET',
  7.                 success:function(data){
  8.                 var myTemplate = Handlebars.compile($("#table-template").html());
  9.                 //将json对象用刚刚注册的Handlebars模版封装,得到最终的html,插入到基础table中。
  10.                 $('#tableList').html(myTemplate(data.data));
  11.                 }
  12.             });
  13.         });
  14.     </script>
复制代码
后端:

  1. public function test1()
  2.     {
  3.         if(false === $this->request->isAjax())
  4.         {
  5.             return view();
  6.         }
  7.     }
  8. public function student()
  9.     {
  10.         $student    =   [
  11.             [
  12.                 'name'  => "张三",
  13.                 'sex'   => "男",
  14.                 'age'   => 28
  15.             ],
  16.             [
  17.                 'name'  => "李四",
  18.                 'sex'   => "女",
  19.                 'age'   => 30
  20.             ],
  21.             [
  22.                 'name'  => "妞妞",
  23.                 'sex'   => "女",
  24.                 'age'   => 32
  25.             ]
  26.         ];
  27.         return api(['student'=>$student],200,'请求成功');
  28.     }
复制代码

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





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

分析:

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


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

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


代码如下:
前端:

  1. <body>
  2.        <h1>with-进入到某个属性(进入到某个上下文环境)</h1>
  3.         <!--基础html框架-->
  4.        <table>
  5.         <thead>
  6.             <tr>
  7.                 <th>姓名</th>
  8.                 <th>性别</th>
  9.                 <th>年龄</th>
  10.                 <th>兴趣爱好</th>
  11.             </tr>
  12.         </thead>
  13.         <tbody id="tableList">
  14.         </tbody>
  15.     </table>
  16.      <!--Handlebars.js模版放在script标签中,保留了html原有层次结构,模版中要写一些操作语句-->
  17.   <!--id可以用来唯一确定一个模版,type是模版固定的写法-->
  18.     <script id="table-template" type="text/x-handlebars-template">
  19.       {{#each this}}
  20.         <tr>
  21.             <td>{{name}}</td>
  22.             <td>{{sex}}</td>
  23.             <td>{{age}}</td>
  24.             <td>
  25.                  {{#with favorite}}
  26.                     {{#each this}}
  27.                         <p>{{name}}</p>
  28.                     {{/each}}
  29.                  {{/with}}
  30.             </td>
  31.         </tr>
  32.         {{/each}}
  33.     </script>
  34. </body>
复制代码
  1.     <!--进行数据处理、html构造-->
  2.     <script type="text/javascript">
  3.        $(document).ready(function() {
  4.         $.ajax({
  5.                 url:'test2api',
  6.                 method:'GET',
  7.                 success:function(data){
  8.                 //$("#table-template").html()是jquery的语法。。。
  9.                 var myTemplate = Handlebars.compile($("#table-template").html());
  10.                 //将json对象用刚刚注册的Handlebars模版封装,得到最终的html,插入到基础table中。
  11.                 $('#tableList').html(myTemplate(data.data.student));
  12.                 }
  13.             });
  14.      });
  15.   </script>
复制代码

后端:

  1.     public function test2()
  2.     {
  3.         if(false === $this->request->isAjax())
  4.         {
  5.             return view();
  6.         }
  7.     }
  8.     public function test2api()
  9.     {
  10.         $student  =   [
  11.             [
  12.                 'name'  => "张三丰",
  13.                 'sex'   => "男",
  14.                 'age'   => 28,
  15.                 'favorite'  =>[
  16.                     ['name' =>  "唱歌"],
  17.                     ['name' =>  "篮球"]
  18.                 ]
  19.             ],
  20.             [
  21.                 'name'  => "李妮妮",
  22.                 'sex'   => "女",
  23.                 'age'   => 30,
  24.                 'favorite'  =>[
  25.                     ['name' =>  "上网"],
  26.                     ['name' =>  "足球"]
  27.                 ]
  28.             ],
  29.             [
  30.                 'name'  => "王妞妞",
  31.                 'sex'   => "女",
  32.                 'age'   => 18,
  33.                 'favorite'  =>[
  34.                     ['name' =>  "电影"],
  35.                     ['name' =>  "旅游"]
  36.                 ]
  37.             ]
  38.         ];
  39.         return api(['student'=>$student],200,'请求成功');
  40.     }
复制代码

这个老哥写的好,可以参考他的,我也是参考他的:JavaScript页面模版引擎handlebars.js学习及使用_handlebars.js for-CSDN博客
对了我这tp8写的返回json的函数是这个:
  1. function api($data, $code = 200, $msg = 'Success')
  2. {
  3.     $result = [
  4.         'code' => $code,
  5.         'message' => $msg,
  6.         'data' => $data,
  7.     ];
  8.     return json($result);
  9. }
复制代码
放在公共函数那里


总结

Ajax渲染页面的很早就想用找不到方便的,奈何本身就懒得写dom(我很菜),找到这个可以做很多事。
有的时候咱页面又不想被扒下来,就可以用这种方式
1.在Ajax请求的时候加个加个参数:域名照旧其他加密起来,传已往参数(域名)不对,就得不到数据了,跨域也给它开上。
  1. var domain = document.domain;
  2. $.ajax({
  3.         url: '/xxxxx?domain='+domain,
  4.         method: 'GET',
  5.         success: function(data) {
  6.             var source = $('#template').html();
  7.             var template = Handlebars.compile(source);
  8.             var html = template({ items: data.data });
  9.             console.log(html);
  10.             $('#result').html(html);
  11.         }
  12.     });
复制代码


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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表