• Vue之路由跳转 传参 aixos 和cookie


      一.路由跳转

      1.1 项目的初始化

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

      精简vue项目的

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

      src 下创建一个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 {
    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{
    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-vuemy-vueprj2>cnpm install vue-cookies

    万一安装错了

    D:MY-vuemy-vueprj2>cnpm uninstall vue-cookies

    再次安装cnpm install vue-cookies

    配置

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

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

      安装

    D:MY-vuemy-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
    ```
  • 相关阅读:
    Android View 阴影的总结
    清晰的教你如何将 Maven 项目上传至 中央仓库以及版本更新
    简单粗暴的上传项目至 Github
    App自动更新(DownloadManager下载器)
    类型判断
    前端防御XSS
    window.location.href/replace/reload()/页面跳转+替换+刷新
    对数组排序进行"洗牌"(随机排序)
    iframe跨域上传图片
    Vim 新手节省时间的小技巧
  • 原文地址:https://www.cnblogs.com/mofujin/p/11666756.html
Copyright © 2020-2023  润新知