Vue之路由跳转 传参 aixos 和cookie

眉间皱痕 提交于 2019-12-01 07:42:09

  一.路由跳转

  1.1 项目的初始化

  vue create m-proj   >>>创建vue项目

  精简vue项目的

  views 视图   About(基本是删除的) Home.(可以作为主业去设置 搭建一些基本的样式) 

  scr 下创建一个css 作为全局的样式 设置

  最后将设置好的全局样式 在mian.js 文件中 导入 作为 项目的入口 类似执行文件(start.py)

  基础的完成了

  

  二.路由传参的几种方法

    2.1 导航栏的显示设置 

    

<template>    <div class="nav">        <ul><li :class="{active: currentPage==='/'}">            <!--<li @click="changePage('/')" :class="{active: currentPage==='/'}">-->                <!--<a href="/" >主页</a>-->                <router-link to="/">主页</router-link>            </li>        <li :class="{active: currentPage==='/course'}">            <!--<li @click="changePage('/')" :class="{active: currentPage==='/'}">-->                <!--<a href="/" >主页</a>-->                <router-link to="/Course">课程</router-link>        </li>        </ul>    </div></template><script>    export default {        name: "Nav",        // changePage()加括号表示有数据需要传参        data(){            return{                // 需要将数据的返回                // 每渲染一个页面,都会出现加载Nav组件,currentPage就会被重置,                // 1)在点击跳转事件中,将跳转的页面用 数据库 保存,在钩子函数中对currentPage进行数据更新                currentPage:'',            }        },        // 方法:        // methods: {        //     // 点击事件        //     changePage(page){        //         // 进行路由的跳转        //         this.$router.push(page);        //        //        //        //     }        //        // },        // 当前组件加载成功,要根据当前实际所在的路径,判断单选激活标签        cerate(){            // 获取路径 导航栏每被加载一次 被点击的页面 就被显示高量 : 也就是显示            this.currentPage=this.$route.path;        }    }</script><style scoped>    .nav {        width: 100%;        height: 60px;        background-color: dodgerblue;    }    .nav li {        float: left;        padding: 15px 30px;        font: normal 30px/30px '微软雅黑';    }    /*.nav li:hover {*/        /*cursor: pointer;*/        /**/    /*}*/    /*.nav li.active {*/        /*cursor: pointer;*/        /**/         /*}*/    /*!*这里的设置主要为了 我们能搞在导航栏进行 点击一整块 扩大范围*!*/    /*.nav li a {*/        /*display: block;*/        /*height: 30px;*/    /*}*/      .nav li:hover {        cursor: pointer;        background-color: aquamarine;    }    .nav li.active {        cursor: pointer;        background-color: aquamarine;    }</style>将导航栏组件() 在 view 中注册
// 将导航栏进行 导入和注册 上面写Nav 标签 import Nav from '@/components/Nav.vue'export default {  name: 'home',  components: {      Nav,            },
<div class="home">   <Nav></Nav> 引入组件</div>

 

2.2 路由进行跳转的四大方法

  

<template>    <div class="home">       <Nav></Nav>    <!--// 自己设计一个页面跳转-->    <div class="router">      <!--设置路由 设计点击按钮-->      <!--方法 1 path --> 方法      <button type="button" @click="goPage('/course')">课程页</button>      <button type="button" @click="goPage('/')">主页</button>                  <!--// 方法 2 go(数字)-->方法      <button type="button" @click="goBack">返回上一页</button>                   <!--// 方法3 name -->方法            <!-- 拓展性-->      <button type="button" @click="goPageName('course')">通过name进行跳转</button>                        <!--// 方法(4) 将 name router 中的应用--> 运用a标签的特性      <!--//原来的条状 to ='' a 标签的属性-->      <!--<router-link to="/course">课程页的name </router-link>>-->      <!--// 换成变量 {}  :to属性的要特别注意 'course' 是取值所以要字符串-->      <router-link :to="{name:'course'}">课程页的name </router-link>>    </div>    <h1>主页</h1>  </div></template><script> // 将导航栏进行 导入和注册 上面写Nav 标签 import Nav from '@/components/Nav.vue'export default {  name: 'home',  components: {      Nav,      },      methods: {          goPage(page) {              // 逻辑跳转 (1)              let currentPage = this.$route.path; // router.path 取值              // 若是home 页面就不让他进行跳转              if (currentPage !==page){                  this.$router.push(page)              }          },          // (2)          goBack(){              // ji逻辑使用history 返回上一层              // this.$router.go(-1)              // 返回上量页              // this.$router.go(-2);              // 前进一页              // this.$router.go(1);              // 前进页              // this.$router.go(2);          },          // (3)          // 总结路由跳转的方式 点击事件          goPageName(goPageName){              this.$router.push(goPageName)          }      }}</script>

  2.2 三种传参方式

<template>    <div class="course-card">        <!--// {{// 变量相关}}-->        <h1 @click="goDetail">{{course.name}}</h1>    
    <!--方法二:link 直接跳转-->    <router-link :to="`course/${course.id}/detail`">{{course.name}}</router-link></div>
    </div></template><script>    export default {        name: "CourseCard",        // 从父标签    // <div class="main">    //         <CourseCard v-for="course in course_list" :key="course.name" :course="course"></CourseCard>    // </div>        props:['course'],      方法

 

 

        methods:{            // goDetail(){            //     this.$router.push({            //         // 跳转到详情页 进行页面详情展示            //         name:'course-detail',                    // 点击的同时发送id 详情页可以通过param query 获取                    //Object fullPath: "/course/detatil"                    // hash: ""                    // matched: [{…}]                    // meta: {}                    // name: "course-detail"                    // params: {}                    // path: "/course/detatil"                    // query: {}                    // __proto__: Object                    // 这是可以 详情页可以进行接收的参数                    // 第一种传参方式                    // params: {id:this.course.id},                    // 第一种传参过去 跳转后页面会刷新                    // 第二种传参方式                    // query: {id:this.course.id}                     // 第一种传参过去 跳转后页面不会刷新                    // 第三种常用比较灵活()                    goDetail(){                         // 跳转到详情页 进行页面详情展显示 >>> 手动拼接不再通过name                        // params: {id: "2"} d第三种的话是将 $是前端的站位符号 %s                        this.$router.push(`/course/${this.course.id}/detail`)            }    }    }</script><style scoped>     /*// 设置一下 我们课程列表的样式*/    .course-card h1{        width: 250px;        height: 250px;        background-color:lightsalmon;        border-radius: 50%;        font:normal 22px/250px 'STSong';        float: left;        text-align: center;        cursor: pointer;        margin: 20px;    }</style>

  三.vue-cookies 插件的 下载-配置-使用

  

D:\MY-vue\my-vueprj2>cnpm install vue-cookies

万一安装错了

D:\MY-vue\my-vueprj2>cnpm uninstall vue-cookies

再次安装cnpm install vue-cookies

 

配置

这里出错了 ???? 回去整理

 

  四.axios -- vue 中的ajax 异步提价数据

  安装

D:\MY-vue\my-vueprj2>cnpm install axios

 

  

  配置

  main,js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'

Vue.config.productionTip = false;


// 项目的初始化全局样式的配置
import  '@/assets/css/global.css'

// 配置全局的cookies
import cookies from 'vue-cookies'
// 直接舍给vue原型
Vue.prototype.$cookies=cookies;

// 配置axios 请求后台的ajax
import axios from 'axios'
Vue.prototype.$axios=axios;
new Vue({
  router,
  store,

  render: h => h(App)
}).$mount('#app');

 

  使用

<template>

     <div class="test-page">
         <Nav></Nav>
    <h1>测试页面</h1>
         <p>
         <input type="text" v-model=" tokenInput">
             <button @click="getToken">获取token</button>



         </p>
         <hr>
         <div class="ajax">
             <input type="text" v-model="username">
             <button @click="ajaxAction">提交按钮</button>

         </div>



     </div>
</template>

<script>
    import Nav from '@/components/Nav.vue'
    export default {
        name: "TestPage",
        components:{
            Nav
        },
        data(){
            return{
                tokenInput:'',
                token:'',
                username:'',
            }
        },
        // 获取token
        methods:{
            getToken(){
                // 什么是token
                // 谁产生的 后台的存储(session表,文件,缓存) 前台存储cookie
                //  怎么用 服务器生成反给 前台 登录认证 登录后的请求
                // if (this.token){
                //     let token=this. tokenInput ;
                //     // token获取后需要前台自己进行存储cookie
                //     // 增 查 更改 删
                //     // 安装vue-cookies
                // }

            },

            // ajax
            ajaxAction(){
                if (this.username){
                    //
                    this.$axios({
                        url:"http://127.0.0.1:8000/test/ajax",
                        methods:'get',
                        // 请求发送数据 下面的参数

                        params:{
                            username:this.username,
                        }
                        // 回调函数
                        // 成功是
                    }).then(function (response) {
                        console.log(response)
                        // 失败是 打印
                    }).catch(function (error) {
                        console.log(error)
                    });
data 也可以发数据 方法二

                        this.$axios({
                        url:"http://127.0.0.1:8000/test/ajax",
                        methods:'post',
                        // 请求发送数据 下面的参数

                        data:{
                            username:this.username,
                        }
                        // 回调函数
                        // 成功是
                    }).then(function (response) {
                        console.log(response)
                        // 失败是 打印
                    }).catch(function (error) {
                        console.log(error)
                    })
                }

            }




        }

    }
</script>

<style scoped>

</style>

 

  

    下载-安装-使用

    后端提交数据 -=--cookio(跨域问题)同源策略

    不是同一服务器发来的请求 拒绝请求 同源策略(CORS)

    如何解决

    django解决跨域问题

    后台安装django-cors-headers 模块

    

   (1) D:\day67_djproj>pip install django-cors-headers)

   (2))注册

  

INSTALLED_APPS = [    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    'app01.apps.App01Config',    'corsheaders']

   (3) 设置中间件

MIDDLEWARE = [    'django.middleware.security.SecurityMiddleware',    'django.contrib.sessions.middleware.SessionMiddleware',    'django.middleware.common.CommonMiddleware',    # 'django.middleware.csrf.CsrfViewMiddleware',    'django.contrib.auth.middleware.AuthenticationMiddleware',    'django.contrib.messages.middleware.MessageMiddleware',    'django.middleware.clickjacking.XFrameOptionsMiddleware',    'corsheaders.middleware.CorsMiddleware']

      (4)设置跨域

  

# 设置苦于问题 允许跨域CORS_ORIGIN_ALLOW_ALL = True

    上线指定 传输的路径

 

  五.element-ui 

   下载 一定要会用多练啊 在研究一下 老师的视屏

  还有就是cookies 的增改 查 删

 

D:\day67_djproj>npm i element-ui -S

  -配置-

main.js

import ElementUI from 'element-ui';

import 'element-ui/lib/theme-chalk/index.css';

Vue.use(ElementUI);

 

 

  使用

文档

## 路由传参

### 第一种

##### router.js

```js
routes: [
    // ...
    {
        path: '/course/:id/detail',
        name: 'course-detail',
        component: CourseDetail
    },
]
```

##### 跳转.vue

```vue
<template>
    <router-link :to="`/course/${course.id}/detail`">{{ course.name }}</router-link>
</template>
<script>
    // ...
    goDetail() {
        this.$router.push(`/course/${this.course.id}/detail`);
    }
</script>
```

##### 接收.vue

```js
created() {
    let id = this.$route.params.id;
}
```





### 第二种

##### router.js

```js
routes: [
    // ...
    {
        path: '/course/detail',
        name: 'course-detail',
        component: CourseDetail
    },
]
```

##### 跳转.vue

```vue
<template>
    <router-link :to="{
            name: 'course-detail',
            query: {id: course.id}
        }">{{ course.name }}</router-link>
</template>
<script>
    // ...
    goDetail() {
        this.$router.push({
            name: 'course-detail',
            query: {
                id: this.course.id
            }
        });
    }
</script>
```

##### 接收.vue

```js
created() {
    let id = this.$route.query.id;
}
```







```
export default new Vuex.Store({
    state: {
        title: '默认值'
    },
    mutations: {
        // mutations 为 state 中的属性提供setter方法
        // setter方法名随意,但是参数列表固定两个:state, newValue
        setTitle(state, newValue) {
            state.title = newValue;
        }
    },
    actions: {}
})

赋值
this.$store.state.title = 'newTitle'
this.$store.commit('setTitle', 'newTitle')

取值
console.log(this.$store.state.title)
```





## vue-cookie插件

安装

```
>: cnpm install vue-cookies
```

main.js 配置

```js
// 第一种
import cookies from 'vue-cookies'      // 导入插件
Vue.use(cookies);                    // 加载插件
new Vue({
    // ...
    cookies,                        // 配置使用插件原型 $cookies
}).$mount('#app');

// 第二种
import cookies from 'vue-cookies'    // 导入插件
Vue.prototype.$cookies = cookies;    // 直接配置插件原型 $cookies
```

使用

```js
// 增(改): key,value,exp(过期时间)
// 1 = '1s' | '1m' | '1h' | '1d'
this.$cookies.set('token', token, '1y');

// 查:key
this.token = this.$cookies.get('token');

// 删:key
this.$cookies.remove('token');
```

注:cookie一般都是用来存储token的

```js
// 1) 什么是token:安全认证的字符串
// 2) 谁产生的:后台产生
// 3) 谁来存储:后台存储(session表、文件、内存缓存),前台存储(cookie)
// 4) 如何使用:服务器先生成反馈给前台(登陆认证过程),前台提交给后台完成认证(需要登录后的请求)
// 5) 前后台分离项目:后台生成token,返回给前台 => 前台自己存储,发送携带token请求 => 后台完成token校验 => 后台得到登陆用户
```





## axios插件

安装

```
>: cnpm install axios
```

main.js配置

```js
import axios from 'axios'    // 导入插件
Vue.prototype.$axios = axios;    // 直接配置插件原型 $axios
```

使用

```js
this.axios({
    url: '请求接口',
    method: 'get|post请求',
    data: {post等提交的数据},
    params: {get提交的数据}
}).then(请求成功的回调函数).catch(请求失败的回调函数)
```





跨域问题(同源策略)

```js
// 后台接收到前台的请求,可以接收前台数据与请求信息,发现请求的信息不是自身服务器发来的请求,拒绝响应数据,这种情况称之为 - 跨域问题(同源策略 CORS)

// 导致跨域情况有三种
// 1) 端口不一致
// 2) IP不一致
// 3) 协议不一致

// Django如何解决 - django-cors-headers模块
// 1) 安装:pip3 install django-cors-headers
// 2) 注册:
INSTALLED_APPS = [
    ...
    'corsheaders'
]
// 3) 设置中间件:
MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware'
]
// 4) 设置跨域:
CORS_ORIGIN_ALLOW_ALL = True
```





## element-ui插件

安装

```
>: cnpm i element-ui -S
```

main.js配置

```js
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);
```

使用

```
依照官网 https://element.eleme.cn/#/zh-CN/component/installation api
```

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!