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');


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM