• vue 各种配置 及 与后端的数据交互


    箭头函数

    在 es5 中中只有function

    在 es6 中新增了 箭头函数 与 对象方法

    function f1(){
        console.log('f1 run')
    }
    f1()
    

    这就是很正常的一个函数调用,这叫函数,没有调用者,有调用者的才叫方法

    如果不写上 return 返回值,他就会默认返回空,会打印出 undefined。

    另一种写法

    let r1 = function(){
        return 10;
    }
    

    等号的右边相当于是一个匿名函数,把这个匿名函数赋值给了 r1 ,这个函数也可以写成箭头函数的形式

    let r1 = () => {
        return 10;
    }
    

    当箭头函数的内容只有一个返回值的时候,可以简写

    let r1 = () => '返回值'
    

    当箭头函数有且只有一个参数的时候, ( ) 也可以省略

    let r1 = a => a*10
    

    配置全局css和js

    配置js:

    就拿配置一个url来作为例子

    export default {
        base_url: 'http://localhost:8001',
    }
    

    如果想要在全局都能调用这个js,就必须要在main.js文件里配置

    import settings from '@/assets/js/settings'
    Vue.prototype.$settings = settings;
    

    (vue推荐的是css文件要加文件后缀,其他都不推荐加后缀,所以这里settings不加.js)

    这里还要解释一下prototype:Vue.prototype就相当于是给 Vue这个类添加类的属性,所以所有 Vue实例化出来的对象都可以调用这个属性,为什么要加 $ ,这是默认的,因为拿这个属性不就像是拿vue的成员变量一样吗?所以加个$。

    配置css:

    和js一样,在assets文件夹下建一个css文件夹,写一个css文件就可以了。

    store仓库的应用

    vue 项目中有一个文件夹是 store ,文件夹下有一个index.js 文件,是仓库,用来存储东西。但是他有一个特点,那就是 刷新页面就会重置到初始值。在这个仓库里配置的东西,可以在任何一个组件逻辑中,也可以在任何一个组件模板中访问或者修改。

    state: {
            car:{
                name:"待定",
                price:"0"
            }
        },
    

    使用:

    在任何一个组件逻辑中:this.$store.state.car 访问或是修改
    在任何一个组件模板中:$store.state.car 访问或是修改
    
    

    因为他的特性,所以这个仓库更适合用于移动APP的开发,因为app没有刷新呀

    vue搭建 Element 环境

    Element ,是由饿了么开发的,东西都是组件,专门给vue来用的。

    安装

    到项目所在目录执行

    cnpm install element-ui
    
    

    配置全局环境

    在main.js 里配置

    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    
    Vue.use(ElementUI);//这个是配置全局环境,不需要用,就已经存在了,就是直接可以用,不要调用什么东西了。
    
    

    关于this

    函数中的this

    面向对象函数:this为调用者

    面向过程和面向对象:this可能为调用者

    面向过程:没有this(箭头函数)

    正常写法

            created(){
                //这个this是vue对象,调用ele的组件,所以在ele组件内是拿不到vue对象的
                this.$message({
                    message:'这个ele的弹出框',
                    type:'success',
                    duration:'1000',
                    onClose(){
                        //这里没有拿到ele对象,为undefind,这个方法既属于面向过程也属于面向对象所以this异常
                        alert(this)
                    }
                })
            }
    
    

    那么要怎么在 lel组件内部获取vue对象?

    可以先用一个变量来保存this。

    created(){
                let _this=this
                this.$message({
                    message:'这个ele的弹出框',
                    type:'success',
                    duration:'1000',
                    onClose(){
                        alert(_this)//这里的_this就是vue对象了。
                    }
                })
            }
    
    

    还有一种,通常用这种

    箭头函数

    created(){
                this.$message({
                    message:'这个ele的弹出框',
                    type:'success',
                    duration:'1000',
                    onClose:()=>{
                        alert(this)//函数内部没有this,就会往上一级找
                    }
                })
            }
    
    

    vue 搭建 js 和 jq 环境

    安装jquery

    cnpm install jquery
    
    

    安装bootstrap

    cnpm install bootstrap@3
    
    

    配置环境

    // 加载bs的逻辑
    import "bootstrap"  
    //配置bs的样式
    import "bootstrap/dist/css/bootstrap.css"
    
    

    配置jquery

    项目是不会帮你自动生成配置文件 vue.config.js 文件的,所以要自己手动建,名字一定要这个!

    // 修改该文件内容后,只有重启,才能同步配置
    const webpack = require("webpack");
    
    module.exports = {
        configureWebpack: {
            plugins: [
                new webpack.ProvidePlugin({
                    $: "jquery",
                    jQuery: "jquery",
                    "window.$": "jquery",
                    "window.jQuery": "jquery",
                    Popper: ["popper.js", "default"]
                })
            ]
        }
    };
    
    

    记得配置完了之后一定要重启项目,才能生效。

    前后端分离的数据交互

    在之前我们都是用django来实现前后端的,前后端是不分离的,前端可以用模板语法来写,现在我们的前端是用vue来写的,所以就要涉及到分离的情况下,数据该怎么交互。

    首先不推荐使用 ajax 了,因为他的特点是 dom操作不适合。

    用 axios

    安装

    cnpm install axios
    
    

    main.js 配置

    import Axios from 'axios'
    Vue.prototype.$axios = Axios;
    
    

    然后就可以在 vue 组件里使用了

    created(){
                this.$axios({
                    //拿取全局的js文件 
                    url: this.$settings.base_url + '/cars/',
                    method: 'get',
                    params: {
                    },
                    data: {
                    },
                    //当请求发送成功的时候就会调用then,失败的时候就会调用catch
                }).then((response) => {
                    this.cars_data = response.data;
                    }).catch(error =>{
                        console.log(error)
                })
            }
    
    

    get 请求的时候不会用到 data,只会用params,用来传参,url拼接的数据

    post请求的时候 两个都会用到, data用来携带请求的数据

    现在问题来了,vue项目启动需要占用一个端口,比如说8000 ,django启动也需要占用一个端口比如说8001,那么 vue 的数据要怎么发给 django 呢?这就涉及到了跨域问题

    django跨域问题

    首先一定要安装一个插件

    pip intstall django-cors-headers
    
    

    然后需要在 配置文件settings 中配置

    #注册app
    INSTALLED_APPS= [
        'corsheaders'
    ]
    
    #添加中间件
    MIDDLEWARE = [
        'corsheaders.middleware.CorsMiddleware'
    ]
    
    #允许跨域源
    CORS_ORIGIN_ALLOW_ALL = True
    
    

    这里又有一个问题,我们在开发前后端不分离的项目的时候,会涉及到一个 csrf 的问题,它是用来解决 跨站请求伪造问题的,他的实现原理就是会自动给前端的form表单生成一个隐藏的input框,并给他一个随机生成的字符串,以此来鉴定你这个form表单是不是我允许的。

    那么在前后端分离的情况下,vue要怎么接收这个csrf字符串呢?答案是不能接收,没办法接收,所以那我们只能用老办法了,没错,注释掉 csrf校验的中间件,原因有三点:

    1. csrf 没法传给前端
    2. csrf 这种安全校验方式比较low
    3. 有更好的方式可以代替它

    至于是哪种,后面会讲。

    所以我们只用注释掉就好了。

    那么怎么实现前后端数据交互呢?

    url: this.$settings.base_url + '/cars/',
    
    

    这一句就是访问后端的 url 了,然后在django的 路由层(urls)里面配置好对应的 url

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^cars/', views.cars),
        url(r'^login/', views.login),
        url(r'^register/', views.register),
    ]
    
    

    然后去调用对应的视图函数就好了。

    关于前端 两种请求方式携带的数据,后端的拿取方式

    def login(request):
        if request.method == 'POST':
    		print(request.body)#如果是 post请求的话,前端data中带的数据都在这里面
            
        if request.method == 'GET':
            print(request.GET)#如果是 get请求的话,前端params中带的数据都在这里面
            
        return JsonResponse(back_dic)
    
    
    

    然后返回的数据,就会被前端 axios 中的 then 接收

    then(response => {
                        this.$message({
                            //接受的数据就在 response.data中
                            message: response.data.msg,
                            type: 'warning'
                        });
    
    

    vue 使用 cookies

    安装

    cnpm install vue-cookies
    
    

    环境配置

    import Cookies from 'vue-cookies'
    Vue.prototype.$cookies = Cookies;
    
    

    使用cookies

     // 有响应的登录认证码,存储在cookie中
                        // 设置:set(key, val, exp)
                        // 取值:get(key)
                        // 删除:remove(key)
                        let token =  1000;
                        if (token) {
                            //设置cookies,第一个参数是键,第二个是值,第三个是过期时间。
                             this.$cookies.set('token', token, '2d');
    
                            //拿取cookies
                             console.log(this.$cookies.get('token'));
                            
                            //删除cookies
                             this.$cookies.remove('token');
    
    
  • 相关阅读:
    分布式系统关注点(3)——过去这几十年,分布式系统的「数据一致性」精华都在这了!
    分布式系统关注点(1)——不知道是不是最通俗易懂的《数据一致性》剖析了
    《西虹市首富》给我们技术人带来的思考
    Kaazing Gateway简单使用
    pylot测试工具环境搭建
    NodeJS学习笔记
    JavaScript逗号操作符
    翻译:SockJS-node文档(一)
    【原】Learning Spark (Python版) 学习笔记(二)----键值对、数据读取与保存、共享特性
    2015年总结与2016年目标和计划
  • 原文地址:https://www.cnblogs.com/chanyuli/p/11878181.html
Copyright © 2020-2023  润新知