uni-app框架之路由和路由傳參

1. 路由(頁面管理)

uni-app 頁面路由全部交給框架統(tǒng)一管理,開發(fā)者需要在pages.json里配置每個路由頁面的路徑及頁面樣式(類似小程序在app.json中配置頁面路由)。所以 uni-app 的路由用法與 Vue Router 不同(如仍希望采用 Vue Router 方式管理路由,可在插件市場搜索 Vue-Router)。

1.1 路由跳轉(zhuǎn)方式

說明:uni-app`有兩種路由跳轉(zhuǎn)方式:使用navigator組件跳轉(zhuǎn)、調(diào)用API跳轉(zhuǎn)。

1.2 頁面棧

框架以棧的形式管理當(dāng)前所有頁面, 當(dāng)發(fā)生路由切換的時候,頁面棧的表現(xiàn)如下:

路由方式 頁面棧表現(xiàn) 觸發(fā)時機
初始化 新頁面入棧 uni-app 打開的第一個頁面
打開新頁面 新頁面入棧 調(diào)用 API uni.navigateTo 、使用組件 <navigator open-type="navigate"/>
頁面重定向 當(dāng)前頁面出棧,新頁面入棧 uni.redirectTo 、使用組件 <navigator open-type="redirectTo"/>
頁面返回 頁面不斷出棧,直到目標返回頁 調(diào)用 API uni.navigateBack 、使用組件 <navigator open-type="navigateBack"/> 、用戶按左上角返回按鈕、安卓用戶點擊物理back按鍵
Tab 切換 頁面全部出棧,只留下新的 Tab 頁面 調(diào)用 API uni.switchTab 、使用組件 <navigator open-type="switchTab"/> 、用戶切換 Tab
重加載 頁面全部出棧,只留下新的頁面 調(diào)用 API uni.reLaunch 、使用組件 <navigator open-type="reLaunch"/>
  • navigateTo, redirectTo 只能打開非 tabBar 頁面。
  • switchTab 只能打開 tabBar 頁面。
  • reLaunch 可以打開任意頁面。
  • 頁面底部的 tabBar 由頁面決定,即只要是定義為 tabBar 的頁面,底部都有 tabBar
  • 不能在 App.vue 里面進行頁面跳轉(zhuǎn)。

1.3 獲取當(dāng)前頁面棧

getCurrentPages() 函數(shù)用于獲取當(dāng)前頁面棧的實例,以數(shù)組形式按棧的順序給出,第一個元素為首頁,最后一個元素為當(dāng)前頁面。
注意: getCurrentPages() 僅用于展示頁面棧的情況,請勿修改頁面棧,以免造成頁面狀態(tài)錯誤。
每個頁面實例的方法屬性列表如下:

方法 描述 平臺說明
page.$getAppWebview() 獲取當(dāng)前頁面的webview對象實例 5+App
page.route 獲取當(dāng)前頁面的路由 -

uni-appgetCurrentPages()獲得的頁面里內(nèi)置了一個方法 $getAppWebview() 可以獲取當(dāng)前頁面的webview對象實例,從而獲得 webview 的 style、id等屬性,也可設(shè)置 webview 的 style。注意:此方法僅 5+app 支持。

2. 路由傳值(頁面?zhèn)鲄?

說明:頁面生命周期的onLoad()監(jiān)聽頁面加載,其參數(shù)為上個頁面?zhèn)鬟f的數(shù)據(jù),參數(shù)類型為Object(用于頁面?zhèn)鲄ⅲ?。如?/p>

  • 頁面 1 傳遞參數(shù)
//頁面跳轉(zhuǎn)并傳遞參數(shù)
uni.navigateTo({
    url: 'page2?name=liy&message=Hello'
});

url為將要跳轉(zhuǎn)的頁面路徑 ,路徑后可以帶參數(shù)。參數(shù)與路徑之間使用?分隔,參數(shù)鍵與參數(shù)值用=相連,不同參數(shù)用&分隔。如 'path?key1=value2&key2=value2',path為下一個頁面的路徑,下一個頁面的onLoad函數(shù)可得到傳遞的參數(shù)。

  • 頁面 2 接收參數(shù)
onLoad: function (option) { //option為object類型,會序列化上個頁面?zhèn)鬟f的參數(shù)
        console.log(option.name); //打印出上個頁面?zhèn)鬟f的參數(shù)。
        console.log(option.message); //打印出上個頁面?zhèn)鬟f的參數(shù)。
    }

注意:url有長度限制,太長的字符串會傳遞失敗,可使用窗體通信、全局變量,或encodeURIComponent等多種方式解決。

示例一:傳遞簡單參數(shù)

  • home.vue中傳遞參數(shù)
<template>
    <view>
        <page-head :title="title"></page-head>
        <view class="uni-padding-wrap uni-common-mt">
            <view class="uni-btn-v">
                <button @tap="navigateTo">跳轉(zhuǎn)新頁面,并傳遞數(shù)據(jù)</button>
            </view>
        </view>
    </view>
</template>
<script>
export default {
    data() {
        return {
            title: '主頁',
        }
    },
    methods: {
        navigateTo() {
            uni.navigateTo({
                url: 'new-page1?data=Hello'
            })
        }
    }
}
</script>
<style>

</style>
  • new-page1.vue 中接收數(shù)據(jù)
<template>
    <view>
        <view>
            {{data}}
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                data:""
            }
        },
        onLoad(e){
            if(e.data){
                this.data = e.data;
                console.log(e.data); //打印出上個頁面?zhèn)鬟f的參數(shù)。
            }
        }
    }
</script>
<style>
    
</style>

示例二:傳遞數(shù)據(jù)集合

  • home.vue中傳遞數(shù)據(jù)集合
<template>
    <view>
        <page-head :title="title"></page-head>
        <view class="uni-padding-wrap uni-common-mt">
            <view class="uni-btn-v">
                <button @tap="JumpToNewPage">跳轉(zhuǎn)新頁面,并傳遞數(shù)據(jù)集合</button>
            </view>
        </view>
    </view>
</template>
<script>
export default {
    data() {
        return {
            title: '主頁',
            processList:[
                {
                    "process_id": "5",
                    "process_name": "卷下盤"
                },
                {
                    "process_id": "3",
                    "process_name": "接后片"
                },
                {
                    "process_id": "6",
                    "process_name": "接前片"
                },
                {
                    "process_id": "7",
                    "process_name": "水洗標"
                },
                {
                    "process_id": "8",
                    "process_name": "釘扣"
                },
                {
                    "process_id": "1",
                    "process_name": "貼口袋"
                },
                {
                    "process_id": "2",
                    "process_name": "做袖叉"
                },
                {
                    "process_id": "3",
                    "process_name": "做袖英"
                },
                {
                    "process_id": "4",
                    "process_name": "縫衣領(lǐng)"
                }
            ]
        }
    },
    methods: {
        JumpToNewPage:function(){
            console.log("JumpToNewPage-processList1:" + JSON.stringify(this.processList));
            var processList = JSON.stringify(this.processList);
            uni.navigateTo({
                url: 'new-page2?processList=' + processList
            })
        }
    }
}
</script>
<style>

</style>
  • new-page2.vue 中接收數(shù)據(jù)集合
<template>
    <view>
        <view v-for="(item,index) in processList" :key="index">
            {{item.process_name}}
        </view>
    </view>
</template>
<script>
export default {
    data() {
        return {
            processList:[]
        }
    },
    onLoad(options){
        if(options.processList){
            console.log("onLoad-processList2:" + options.processList);
            // this.processList = options.processList;
            // console.log("onLoad-processList3:" + this.processList);
            this.processList = JSON.parse(options.processList);
            console.log("onLoad-processList3:" + JSON.stringify(this.processList));
        }
    }
}
</script>
<style>

</style>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • uni-app跨平臺框架官方教程 鏈接:https://ke.qq.com/course/343370 一、框架簡...
    Neyo_涼閱讀 36,655評論 0 43
  • 1.保留當(dāng)前頁面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個頁面,使用uni.navigateTo: 示例: 在起始頁面跳轉(zhuǎn)到test.v...
    宇宙無敵美少女_阿嬌閱讀 44,732評論 0 1
  • 因新工作主要負責(zé)微信小程序這一塊,最近的重心就移到這一塊,該博客是對微信小程序整體的整理歸納以及標明一些細節(jié)點,初...
    majun00閱讀 7,638評論 0 9
  • 寫在有道筆記上,uni項目實踐,轉(zhuǎn)過來格式不太好看,先做此記錄吧。 看了uniapp多端開發(fā),感覺不錯,還有模板商...
    YellowPoint閱讀 2,556評論 0 1
  • 8月也快結(jié)束了.一年一半過2個月也到了,突然發(fā)覺自己還有好多事沒完成,想去年定的去澳門蹦極、去成都重慶吃火鍋、去云...
    蝦蝦哥閱讀 216評論 7 0

友情鏈接更多精彩內(nèi)容