1. 程式人生 > >vue-router 路由元件傳參

vue-router 路由元件傳參

1.最簡單的用 name傳參

$route.name  輸出的是當前路由 ,不過這個一般不用

1.在路由檔案router/index.js裡配置name屬性。
routes: [
    {
      path: '/',
      name: 'Hello',
      component: Hello
    }
]

2.模板裡(src/App.vue)用$router.name的形勢接收,比如直接在模板中顯示:

<p>{{ $route.name}}</p>

2.使用vuex 狀態管理    this.$store.state.count  獲取資料

1.在路由檔案store/store.js裡配置name屬性。
const state = {
	count:3
}
export default new Vuex.Store({
	state,
	actions,
	modules,
  	getters,
	mutations
})

2.模板裡(src/App.vue)用$router.name的形勢接收,比如直接在模板中顯示:
<template>
    <div>
        <h4>測試1:Count is {{count}}</h4>
    </div>
</template>
<script>
export default {
	computed:{
		count(){
		    return this.$store.state.count
		}
	}
}
</script>

3.通過<router-link> 標籤中的to傳參

<router-link 
    :to="{
        path: 'yourPath', 
        params: { 
            name: 'name', 
            dataObj: data
        },
        query: {
            name: 'name', 
            dataObj: data
        }
    }">
</router-link>

 1. path -> 是要跳轉的路由路徑,也可以是路由檔案裡面配置的 name 值,兩者都可以進行路由導航
 2. params -> 是要傳送的引數,引數可以直接key:value形式傳遞
 3. query -> 是通過 url 來傳遞引數的同樣是key:value形式傳遞

 // 2,3兩點皆可傳遞

在子元件中獲取this.$route.query.name

4.$router方式跳轉

(1).$route.params.id獲取路由上的引數 

如新聞列表頁,我們需要傳遞新聞ID,給新聞詳細頁。 

1.新聞列表頁:<router-link to="/news/001">新聞001</router-link> 

我們訪問/news/001,跳轉到新聞詳細頁,展示001的這條新聞。

2.新聞詳細頁元件準備
    <template id="NewsDetail">
            新聞詳細頁面<span>{{$route.params.id}}</span>
    </template>

$route.params.id獲取路由上的引數 


在js裡定義路由元件:
 const NewsDetail = { template: '#NewsDetail' };//新聞詳細頁元件

3.定義路由,增加一個路由

  { path: '/news/:id', component: NewsDetail },

如demo 所示

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="utf-8">
    <script src="http://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
</head>
<body> 
    <div id="box">
        <p>
            <router-link to="/home">home</router-link>
            <router-link to="/news">news</router-link>
        </p>
          <router-view></router-view>
    </div>

    <!-- 模板抽離出來 -->
    <template id="home">
        <!-- 注意:元件只能有一個根元素,所以我們包裝到這個div中 -->
        <div>
            <h2>首頁</h2>
             <router-link to="/home/login">登入</router-link>
            <router-link to="/home/reg">註冊</router-link>
            <!-- 路由匹配到的元件將渲染在這裡 -->
            <router-view></router-view>
        </div>
    </template>

    <template id="news">
        <div>
            <h2>新聞列表</h2>
            <ul>
                <li>
                    <router-link to="/news/001">新聞001</router-link>
                </li>
                <li>
                    <router-link to="/news/002">新聞002</router-link>
                </li>
            </ul>           
        </div>
    </template>

    <template id="login">
        <div>登入介面</div>
    </template>
    <template id="reg">
        <div>註冊介面</div>
    </template>

    <template id="NewsDetail">
        <div>
            新聞詳細頁面
            <span>{{$route.params.id}}</span>
        </div>
    </template>

    <script type="text/javascript">
        // 1. 定義(路由)元件。
        const Home = { template: '#home' };
        const News = { template: '#news' };

        const Login = { template: '#login' };
        const Reg = { template: '#reg' };

        //新聞詳細頁元件
        const NewsDetail = { template: '#NewsDetail' };


        // 2. 定義路由
        const routes = [
             { path: '/', redirect: '/home' },
            { 
                path: '/home', 
                component: Home, 
                children:[
                    { path: '/home/login', component: Login},
                    { path: '/home/reg', component: Reg}
                ]
            },
            { path: '/news', component: News,},
            { path: '/news/:id', component: NewsDetail },

        ]

        // 3. 建立 router 例項,然後傳 `routes` 配置
        const router = new VueRouter({
            routes // (縮寫)相當於 routes: routes
        })


        // 4. 建立和掛載根例項。
        // 記得要通過 router 配置引數注入路由,
        // 從而讓整個應用都有路由功能
        const app = new Vue({
          router
        }).$mount('#box')

        // 現在,應用已經啟動了!
    </script>
</body>
</html>

此例子也可以參考:vue-router 基本語法 中vue專案中路由配置小案例 傳參

5.<router-view>屬性攜帶資料

注意:只針對相連的子元件

父元件:
<router-link to="/message">新聞資訊</router-link> 
<router-view :msg="msg"></router-view>
export default {
	data () {
		return {
			msg:"router-view傳遞"
		}
	},
}
</script>
子元件:message.vue
<h1>{{msg}}</h1>
export default {
	//要先宣告接受屬性,
	props:["msg"]
}
</script>