在django中使用vue.js需要注意的地方

有接口如下:

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

  返回json数据:

[
    {
        "name": "(山上双人标准间)黄山经典二日游(魅力黄山,日出云海,人间仙境,春暖花开)",
        "day": 2,
        "night": 1,
        "favorites": 0,
        "score_avg": 4,
        "photo_url": "/media/images/scenic/a9836502.jpg",
        "review_num": 2,
        "unit_price": 0
    },
    {
        "name": "0购物+三环内接!郑州—焦作云台山二日游,含1晚住宿+1早2正餐,无强制消费",
        "day": 2,
        "night": 1,
        "favorites": 0,
        "score_avg": 4,
        "photo_url": "/media/images/scenic/3a82e902.jpg",
        "review_num": 1,
        "unit_price": 329
    },
    {
        "name": "岛内酒店上门接>厦门至泉州开元寺+南少林+洛阳桥+西街+天后宫一日游",
        "day": 1,
        "night": 0,
        "favorites": 0,
        "score_avg": 4,
        "photo_url": "/media/images/scenic/f8106f02.jpg",
        "review_num": 2,
        "unit_price": 0
    },
    {
        "name": "南宁?西安兵马俑华清池延安黄帝陵壶口瀑布城墙5日/耳麦自助餐/0购物/接送机",
        "day": 5,
        "night": 4,
        "favorites": 0,
        "score_avg": 4,
        "photo_url": "/media/images/scenic/93835fbb.jpg",
        "review_num": 1,
        "unit_price": 3045
    },
    {
        "name": "北京+天津纯玩6日游/餐餐特色/连锁酒店/专车专导/故宫/瓷房子赠升国旗",
        "day": 6,
        "night": 5,
        "favorites": 0,
        "score_avg": 4,
        "photo_url": "/media/images/scenic/0f.water.jpg",
        "review_num": 1,
        "unit_price": 0
    },
    {
        "name": "住蒙古包>内蒙古希拉穆仁草原+响沙湾沙漠+成吉思汗陵+呼和浩特市内双飞五日游",
        "day": 5,
        "night": 4,
        "favorites": 0,
        "score_avg": 4,
        "photo_url": "/media/images/scenic/4b806602.jpg",
        "review_num": 1,
        "unit_price": 0
    },
    {
        "name": "北京全景高端五星游丨餐餐特色&0购物0自费&24H接送&赠德云社+人民大会堂",
        "day": 5,
        "night": 4,
        "favorites": 0,
        "score_avg": 4,
        "photo_url": "/media/images/scenic/ca841f56.jpg",
        "review_num": 1,
        "unit_price": 0
    },
    {
        "name": "机票+含餐>西安兵马俑/华清池/骊山/西岳华山/延安/黄帝陵/壶口瀑布6日",
        "day": 6,
        "night": 5,
        "favorites": 0,
        "score_avg": 4,
        "photo_url": "/media/images/scenic/93835fbb.jpg",
        "review_num": 1,
        "unit_price": 2740
    },
    {
        "name": "高铁/动车往返>宁波—温州雁荡山2日游 净名谷+灵岩景区+大龙湫 赏灵峰夜景",
        "day": 2,
        "night": 1,
        "favorites": 0,
        "score_avg": 4,
        "photo_url": "/media/images/scenic/7565abdd.jpg",
        "review_num": 1,
        "unit_price": 0
    }
]

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

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

首先,在html页面上引入js

<script type="text/javascript" src="{% static ‘js/vue.js‘ %}"></script>
<script type="text/javascript" src="{% static ‘js/axios.min.js‘ %}"></script>
<script type="text/javascript" src="{% static ‘js/common.js‘ %}"></script>
<script>
$(document).ready(function () {
  getHotScheme();                             1. 在dom加载完之后执行getHotScheme函数
});
</script>

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

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

相关html如下:

            <div class="GridLex- gap-30-wrappper package-grid-item-wrapper">

                <div class="GridLex-grid-noGutter-equalHeight" id="scheme_app">

                    <template v-for="schemeInfo in schemesInfo">
                        <div class="GridLex-col-4_sm-6_xs-12 mb-30">
                            <div class="package-grid-item">
                                <a href="detail-page.html">
                                    <div class="image">
                                        <img :src="schemeInfo.photo_url" alt="Tour Package"/>

                                        <div class="absolute-in-image">
                                            <div class="duration"><span>{{ schemeInfo.day }} 天 {{ schemeInfo.night }} 夜</span></div>
                                        </div>
                                    </div>
                                    <div class="content clearfix">
                                        <h5>{{ schemeInfo.name }}</h5>

                                        <div class="rating-wrapper">
                                            <div class="raty-wrapper">
                                                <div class="star-rating-read-only" v-bind:data-rating-score="schemeInfo.score_avg"></div>
                                                <span> / {{ schemeInfo.review_num }} 评论</span>
                                            </div>
                                        </div>
                                        <div class="absolute-in-content">
                                            <span class="btn"><i class="fa fa-heart-o"></i></span>

                                            <div class="price">¥{{ schemeInfo.unit_price }}</div>
                                        </div>
                                    </div>
                                </a>
                            </div>
                        </div>
                    </template>

                </div>

            </div>

js:getHotScheme

function getHotScheme(){
    new Vue({
        el: ‘#scheme_app‘,
        data () {
            return {
            schemesInfo: null
            }
        },
        mounted () {
            axios
            .get(‘/info/schemes‘)
            .then(response => (this.schemesInfo = response.data))
            .catch(function (error) { // 请求失败处理
                console.log(error);
            });
        }
    })
}

解释一下:

  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://blog.csdn.net/jyfu2_12/article/details/79058819

  我还是喜欢第三种:

  将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中的代码:

  

function loadGrade(){
    $(‘.star-rating-read-only‘).raty({
        readOnly: true,
        round: {down: .2, full: .6, up: .8},
        half: true,
        space: false,
        score: function () {
            return $(this).attr(‘data-rating-score‘);
        }
    });
}

function getHotScheme(){
    new Vue({
        el: ‘#scheme_app‘,
        data () {
            return {
            schemesInfo: null
            }
        },
        watch:{
            schemesInfo:function(){
                this.$nextTick(function(){
                    loadGrade()
                })
            }
        },
        mounted () {
            axios
            .get(‘/info/schemes‘)
            .then(response => (this.schemesInfo = response.data))
            .catch(function (error) { // 请求失败处理
                console.log(error);
            });
        }
    })
}

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

  

原文地址:https://www.cnblogs.com/wangbaojun/p/11145887.html

时间: 2024-10-30 14:58:43

在django中使用vue.js需要注意的地方的相关文章

Django中加载js和css文件

Django中加载js和css文件 项目的目录结构如下: mysite |-mysite |-|-static |-|---js和css文件 |-|-|-init.py |-| |-models.py |-| |-views.py |-|-init.py |-|-settings.py |-|-urls.py |-templates |-|-(template html 文件) settings.py中static变量的设置: STATIC_ROOT = os.path.join(os.path

在webpack中配置vue.js

在webpack中配置vue.js 这里有两种在webpack中配置vue.js的方法,如下: 1.在main.js中引入vue的包: index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,

python框架django中结合vue进行前后端分离

一.创建django项目 1.django-admin startproject mysite # 创建mysite项目 2.django-admin startapp app01# 创建app01应用  二.安装vue 安装vue-cli:npm install -g vue-cli (Vue-cli是Vue的脚手架工具,-g表示在全局下安装vue-cli) 安装webpack: npm install webpack -g  (包管理工具,主要是打包和解包用的) 创建项目:vue init

使用VS2017开发APP中使用VUE.js开发遇到打包出来的android文件 在低版本的android(4.3)中无法正常使用

使用VS2017开发VUE的APP应用遇到的问题集合 1,  打包出来的apk文件在Android 6.0版本以上手机可以正常打开,在Android 4.3版本手机上无法打开 原因:一开始猜测是不是VS中安卓设置不正确,最后确定的问题是,低版本内置的浏览器(webview)版本太低,无法解析 ES2015最新的一些语法.需要在Webpack中配置babel-loader,还需要在项目最外层添加一个.babelrc文件用于babel默认解析ES2015中的特殊语法(例如: const,let等)

vscode 中搭建Vue.js

一. 首先安装node环境,并配置: 地址:https://nodejs.org/en/ 安装完成后执行:node --version 在这里我安装的是:12.2.0版本 二.安装Git 直接到以下地址 https://git-scm.com/download/win下载安装Git,安装完成后找到bin路径,将路径添加单PATH中, 保存返回,CMD中运行 git --version 确认安装是否成功,在这里我安装的是2.21.0版本. 三.安装npm环境 在旧版本中没有集成安装npm,在新版本

Django中Form组件拾遗(比较坑爹的地方+易忽略的点)

[001]Form组件之自动渲染一个ID选择器 在前面的章节中,我们使用了Django自带的Form组件帮我们完成对表单数据的校验,借助于Form组件,它帮我们自动渲染出input输入框,之前没怎么注意这块,最近才发现 它帮我们渲染出的input输入框自带了id选择器,来看如下的截图就明白了,这个地方坑了很久: <input class="form-control" id="id_email" name="email" placeholde

【前端】Vue.js经典开源项目汇总

Vue.js经典开源项目汇总 原文链接:http://www.cnblogs.com/huyong/p/6517949.html Vue是什么? Vue.js(读音 /vju?/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合.另一方面,Vue 完全有能力驱动采用单文件组件和 Vue 生态系统支持的库开发的复杂单页应用. Vue.js 的目标是通过

vue,js基础知识

Vue.js是一套构建用户界面(view)的MVVM框架.Vue.js的核心库只关注视图层,并且非常容易学习,非常容易与其他库或已有的项目整合. 1.1 Vue.js的目的 Vue.js的产生核心是为了解决如下三个问题: 解决数据绑定的问题: Vue.js框架生产的主要目的是为了开发大兴单页面应用(SPA:Single Page Application) Angular.js中对PC端支持的比较良好,但是对移动端支持就一般.而Vue.js主要支持移动端,也支持PC端. 3. 它还支持组件化.也就

转载自keepfool的Vue.js概述

概述 之前我们学习了Vue.js的一些基础知识,以及如何开发一个组件,然而那些示例的数据都是local的.在实际的应用中,几乎90%的数据是来源于服务端的,前端和服务端之间的数据交互一般是通过ajax请求来完成的. 说起ajax请求,大家第一时间会想到jQuery.除了拥有强大的DOM处理能力,jQuery提供了较丰富的ajax处理方法,它不仅支持基于XMLHttpRequest的ajax请求,也能处理跨域的JSONP请求. 之前有读者问我,Vue.js能结合其他库一起用吗?答案当然是肯定的,V