经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
django中使用vue.js的要点总结
来源:jb51  时间:2019/7/8 8:30:39  对本文有异议

有接口如下:

http://127.0.0.1:8000/info/schemes/

返回json数据:

  1. [
  2. {
  3. "name": "(山上双人标准间)黄山经典二日游(魅力黄山,日出云海,人间仙境,春暖花开)",
  4. "day": 2,
  5. "night": 1,
  6. "favorites": 0,
  7. "score_avg": 4,
  8. "photo_url": "/media/images/scenic/a9836502.jpg",
  9. "review_num": 2,
  10. "unit_price": 0
  11. },
  12. {
  13. "name": "0购物+三环内接!郑州—焦作云台山二日游,含1晚住宿+1早2正餐,无强制消费",
  14. "day": 2,
  15. "night": 1,
  16. "favorites": 0,
  17. "score_avg": 4,
  18. "photo_url": "/media/images/scenic/3a82e902.jpg",
  19. "review_num": 1,
  20. "unit_price": 329
  21. },
  22. {
  23. "name": "岛内酒店上门接>厦门至泉州开元寺+南少林+洛阳桥+西街+天后宫一日游",
  24. "day": 1,
  25. "night": 0,
  26. "favorites": 0,
  27. "score_avg": 4,
  28. "photo_url": "/media/images/scenic/f8106f02.jpg",
  29. "review_num": 2,
  30. "unit_price": 0
  31. },
  32. {
  33. "name": "南宁✈西安兵马俑华清池延安黄帝陵壶口瀑布城墙5日/耳麦自助餐/0购物/接送机",
  34. "day": 5,
  35. "night": 4,
  36. "favorites": 0,
  37. "score_avg": 4,
  38. "photo_url": "/media/images/scenic/93835fbb.jpg",
  39. "review_num": 1,
  40. "unit_price": 3045
  41. },
  42. {
  43. "name": "北京+天津纯玩6日游/餐餐特色/连锁酒店/专车专导/故宫/瓷房子赠升国旗",
  44. "day": 6,
  45. "night": 5,
  46. "favorites": 0,
  47. "score_avg": 4,
  48. "photo_url": "/media/images/scenic/0f.water.jpg",
  49. "review_num": 1,
  50. "unit_price": 0
  51. },
  52. {
  53. "name": "住蒙古包>内蒙古希拉穆仁草原+响沙湾沙漠+成吉思汗陵+呼和浩特市内双飞五日游",
  54. "day": 5,
  55. "night": 4,
  56. "favorites": 0,
  57. "score_avg": 4,
  58. "photo_url": "/media/images/scenic/4b806602.jpg",
  59. "review_num": 1,
  60. "unit_price": 0
  61. },
  62. {
  63. "name": "北京全景高端五星游丨餐餐特色&0购物0自费&24H接送&赠德云社+人民大会堂",
  64. "day": 5,
  65. "night": 4,
  66. "favorites": 0,
  67. "score_avg": 4,
  68. "photo_url": "/media/images/scenic/ca841f56.jpg",
  69. "review_num": 1,
  70. "unit_price": 0
  71. },
  72. {
  73. "name": "机票+含餐>西安兵马俑/华清池/骊山/西岳华山/延安/黄帝陵/壶口瀑布6日",
  74. "day": 6,
  75. "night": 5,
  76. "favorites": 0,
  77. "score_avg": 4,
  78. "photo_url": "/media/images/scenic/93835fbb.jpg",
  79. "review_num": 1,
  80. "unit_price": 2740
  81. },
  82. {
  83. "name": "高铁/动车往返>宁波—温州雁荡山2日游 净名谷+灵岩景区+大龙湫 赏灵峰夜景",
  84. "day": 2,
  85. "night": 1,
  86. "favorites": 0,
  87. "score_avg": 4,
  88. "photo_url": "/media/images/scenic/7565abdd.jpg",
  89. "review_num": 1,
  90. "unit_price": 0
  91. }
  92. ]

通过vue去请求这个api,并将数据遍历,生成多个div块模板,并渲染数据,效果图如下:

api 返回json中有9条记录,所以对应应该生成9个上图的div块,开始动手:

首先,在html页面上引入js

  1. <script type="text/javascript" src="{% static 'js/vue.js' %}"></script>
  2. <script type="text/javascript" src="{% static 'js/axios.min.js' %}"></script>
  3. <script type="text/javascript" src="{% static 'js/common.js' %}"></script>
  4. <script>
  5. $(document).ready(function () {
  6.   getHotScheme(); 1. dom加载完之后执行getHotScheme函数
  7. });
  8. </script>

要用到vue就少不vue.js,Vue.js 2.0 版本推荐使用 axios 来完成 ajax 请求。

我们将上面功能的实现写在common.js的getHotScheme中

相关html如下:

  1. <div class="GridLex- gap-30-wrappper package-grid-item-wrapper">
  2.  
  3. <div class="GridLex-grid-noGutter-equalHeight">
  4.  
  5. <template v-for="schemeInfo in schemesInfo">
  6. <div class="GridLex-col-4_sm-6_xs-12 mb-30">
  7. <div class="package-grid-item">
  8. <a href="detail-page.html" rel="external nofollow" >
  9. <div class="image">
  10. <img :src="schemeInfo.photo_url" alt="Tour Package"/>
  11.  
  12. <div class="absolute-in-image">
  13. <div class="duration"><span>{{ schemeInfo.day }} 天 {{ schemeInfo.night }} 夜</span></div>
  14. </div>
  15. </div>
  16. <div class="content clearfix">
  17. <h5>{{ schemeInfo.name }}</h5>
  18.  
  19. <div class="rating-wrapper">
  20. <div class="raty-wrapper">
  21. <div class="star-rating-read-only" v-bind:data-rating-score="schemeInfo.score_avg"></div>
  22. <span> / {{ schemeInfo.review_num }} 评论</span>
  23. </div>
  24. </div>
  25. <div class="absolute-in-content">
  26. <span class="btn"><i class="fa fa-heart-o"></i></span>
  27.  
  28. <div class="price">¥{{ schemeInfo.unit_price }}</div>
  29. </div>
  30. </div>
  31. </a>
  32. </div>
  33. </div>
  34. </template>
  35.  
  36. </div>
  37.  
  38. </div>

js:getHotScheme

  1. function getHotScheme(){
  2. new Vue({
  3. el: '#scheme_app',
  4. data () {
  5. return {
  6. schemesInfo: null
  7. }
  8. },
  9. mounted () {
  10. axios
  11. .get('/info/schemes')
  12. .then(response => (this.schemesInfo = response.data))
  13. .catch(function (error) { // 请求失败处理
  14. console.log(error);
  15. });
  16. }
  17. })
  18. }

解释一下:

getHotScheme()在DOM加载后执行,其中创建了vue对象,el表示vue的作用范围,它被绑定到了html中的id为scheme_app的div,data中我们需要使用schemesInfo,初始为null,当axios请求成功之后,schemesInfo的值为api的返回的json

在html中:

我们要遍历schemesInfo数据,在需要重复生成的div块外添加 template ,<template v-for="schemeInfo in schemesInfo">````````</template>

被template标签包含的内容将被生成多份,text部分通过{{}}取数据进行渲染,但是在标签属性中使用数据需要做出修改:比如img标签,指定src时不应该使用<img scr=''{{schemeInfo.photo_url}}''> 这将是无效的,应该改为<img :src="schemeInfo.photo_url"> src前面的:时v-bind的简写,用于属性绑定,当然,你也可以写完整,如<div class="star-rating-read-only" v-bind:data-rating-score="schemeInfo.score_avg"></div>

现在看似已经完成了,但是实际上我们的数据并没有被渲染到模板上,这是因为vue 取值的方法{{ }}与django的模板语言冲突,vue取值并未生效,其实解决办法至少有三个,可以参考:https://www.jb51.net/article/164779.htm

我还是喜欢第三种:

将vue相关的html代码块禁用django模板:

在上述html代码前添加{% verbatim %},尾部添加{% endverbatim %},这样vue就可以生效了,

但是还有一个问题

没有被显示出来,原因是类属性为star-rating-read-only的div的js函数需要在数据完成之后加载才能生效

正好,Vue.js 有一个方法 watch,它可以用来监测Vue实例上的数据变动。

我们要监听schemesInfo,如果数据变化,说明vue开始渲染,渲染完成DOM将发生变化,在vue中有个Vue.$nextTick(callback),当dom发生变化,更新后执行的回调。

在这个回调函数中执行star-rating-read-only对应的js函数应该就可以解决这个问题,试一下修改common.js中的代码:

  1. function loadGrade(){
  2. $('.star-rating-read-only').raty({
  3. readOnly: true,
  4. round: {down: .2, full: .6, up: .8},
  5. half: true,
  6. space: false,
  7. score: function () {
  8. return $(this).attr('data-rating-score');
  9. }
  10. });
  11. }
  12.  
  13. function getHotScheme(){
  14. new Vue({
  15. el: '#scheme_app',
  16. data () {
  17. return {
  18. schemesInfo: null
  19. }
  20. },
  21. watch:{
  22. schemesInfo:function(){
  23. this.$nextTick(function(){
  24. loadGrade()
  25. })
  26. }
  27. },
  28. mounted () {
  29. axios
  30. .get('/info/schemes')
  31. .then(response => (this.schemesInfo = response.data))
  32. .catch(function (error) { // 请求失败处理
  33. console.log(error);
  34. });
  35. }
  36. })
  37. }

绿色部分是star-rating-read-only对应的js处理函数,红色部分是我们对vue的修改完善,这样修改以后,果不其然,数据都正确的渲染在了模板上

  

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号