vue-router之params和query的區別

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        ul>li{
            width: 200px;
            height: 50px;
            list-style: none;
            cursor: pointer;
        }
        li:nth-child(1){
            background-color: red;
        }
        li:nth-child(2){
            background-color: green;
        }
        li:nth-child(3){
            background-color: yellow;
        }
        .box{
            width: 300px;
            height: 300px;
            border: 1px solid #000;
        }
    </style>
</head>
<body>
<!--
    params由name引入,query是path和name都可以
-->
<div id="app">
    <ul>
        <router-link tag="li" :to="{path:'/html5',query:{des:'這是html5學院'},params:{des:'這是html5學院'}}">First-router</router-link>
        <router-link tag="li" :to="{name:'Java',query:{des:'這是java學院'},params:{des:'這是java學院'}}">Second-router</router-link>
        <router-link tag="li" :to="{name:'Python',query:{des:'這是python學院'},params:{des:'這是python學院'}}">Third-router</router-link>
    </ul>
    <router-view class="box"></router-view>
</div>


<template id="html5">
    <div class="html5">
        <p>HTML5學院</p>
        <p>query:{{$route.query}}</p>
        <p>params:{{$route.params}}</p>
    </div>
</template>
<template id="java">
    <div class="java">
        <p>java學院</p>
        <p>query:{{$route.query}}</p>
        <p>params:{{$route.params}}</p>
    </div>
</template>
<template id="python">
    <div class="python">
        <p>python學院</p>
        <p>query:{{$route.query}}</p>
        <p>params:{{$route.params}}</p>
    </div>
</template>
<script src="../js/vue.js"></script>
<script src="../js/vue-router.js"></script>
<script>
    const html5 = Vue.extend({
        template:"#html5"
    });
    const java = Vue.extend({
        template:"#java"
    });
    const python = Vue.extend({
        template:"#python"
    });
    const Html5=Vue.component("html5",html5);
    const Java=Vue.component("java",java);
    const Python=Vue.component("python",python);
    const routes=[
        {path:"/html5",name:"Html5",component:Html5},
        {path:"/java",name:"Java",component:Java},
        {path:"/python",name:"Python",component:Python}
    ];
    const router=new VueRouter({
        routes // (縮寫) 相當於 routes: routes
    });
    let vm = new Vue({
        router,
        el: '#app',
        data: {}
    });
</script>
</body>
</html>

跳轉方式:

(1)使用<router-link>跳轉

<router-link tag="li" :to="{path:'/html5',query:{des:'這是html5學院'},params:{des:'這是html5學院'}}">跳轉Html5學院</router-link>

(2)使用this.$router.push()跳轉

this.$router.push({
 name:"html5",
 params:{
 des:"這是html5學院"
 }
});

兩者相同點:

(1)用於跳轉路由時傳遞參數,在跳轉目標路由接收:$route.params或$route.query;

兩者不同點:

(1)url拼接問題
params在傳遞參數時不會把參數拼接在url後面,類似於post請求:
"協議+端口?#/html5"

query在傳遞參數時會把參數拼接在url後面,類似於get請求:
"協議+端口?#/html5?des=這是html5學院"

(2)name和path問題
params只能由name引入

<router-link tag="li" :to="{name:'html5',params:{des:'這是html5學院'}}">First-router</router-link>

query既可以由name引入也可以由path引入

<router-link tag="li" :to="{name:'html5',query:{des:'這是html5學院'}}">First-router</router-link>
<router-link tag="li" :to="{path:'/html5',query:{des:'這是html5學院'}}">First-router</router-link>

(3)頁面刷新問題
params只在路由跳轉時候起作用,如果跳轉完之後再刷新頁面,params消失。而query不會出現這樣的問題。

注意事項

傳遞的方式有:聲明式的導航和編程式的導航router.push(…),但是如果通過改變瀏覽器url直接跳轉的話,參數就無法傳遞到下一個路由。因此這個問題也值得我們想如何去解決,本人目前還沒想到,如果以後對vue-router有更深入的理解會回來補充這個問題。

本人前端小白一枚,只能把自己理解到的部分寫成博客供新人蔘考學習。有問題請各位指出,本人會做改進,謝謝~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章