0


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

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

文章目录


前言

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

  1. 直到今天,遇到了handlebars.js
  2. handlebars.js可以在提前设置好的模板内渲染出内容,功能强大下面演示

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

一、Handlebars.js是什么?

  1. 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. }

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

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

效果

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

分析

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

  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禁用掉,不要让他看到咱返回的数据结构。

标签: 前端

本文转载自: https://blog.csdn.net/m0_55735473/article/details/142489690
版权归原作者 小于晏 所有, 如有侵权,请联系我们删除。

“handlebars.js使用:用ajax渲染内容到前端”的评论:

还没有评论