之前開發了一款藍牙工具,本想着使用android原生開發,無意間發現uniapp也可以進行底層開發,結果一系列踩坑開始,幾次嘗試後,終于沒有問題了,今天總結下我用到的頁面傳值。
一、子标簽回傳資料:
在開發過程中,我們的代碼最好能夠實作低耦合,也就是說,頁面和子标簽之間不要過于依賴,這樣既能夠實作底層代碼複用,也讓單個界面幹淨不少,舉個例子:
我們寫了一個界面,裡面有清單,而且這些清單元素樣式很複雜,那麼我們就應該單一的寫一個清單元素樣式,讓後在本界面裡面複用,但是,子标簽裡面的值如何回傳呢,代碼:
子标簽代碼:
<template>
<view class="message-list">
<view class="u-f-ac u-f-jsb" @tap="btBackValue">名稱:{{item.name}}年齡:{{item.age}</view>
</view>
</template>
<script>
export default{
props:{
item:Object,
index:Number
},
methods:{
//點選清單元素後執行該方法
btBackValue(){
//往清單界面傳值(connectBackV為回傳的方法辨別)
this.$emit('connectBackV', {
name: this.item.name,
age: this.item.age
});
}
}
}
</script>
<style scoped>
.message-list{
border-bottom: 1upx solid #EEEEEE;
padding: 20upx 0;
}
</style>
本頁面代碼:
<template>
<view>
<!--清單-->
<block v-for="(item,index) in list" :key="index">
<messageList :item="item" :index="index" @connectBackV="connectBackV"></messageList>
</block>
</view>
</template>
<script>
import messageList from "../../components/listTest/BT-list.vue";
export default {
components: {
messageList
},
data() {
return {
list: [
{name:"張三",age:21},
{name:"李四",age:22},
{name:"王五",age:25}
]
}
},
methods: {
//接受點選後回傳的值
connectBackV(e){
console.log("電子子标簽後的回傳值為:"+e);
console.log("點選了:"+e.name+"年齡為:"+e.age);
}
}
}
</script>
<style>
</style>
現在,界面會以清單顯示出張三,李四,王五三條資料,當任意點選一條後,背景會列印出資訊
二、子界面向上級界面回傳資料:
此方式應用在,點選按鈕跳轉到子界面,子界面在任意地方向上級界面回傳資料
父頁面代碼:
<view>
<button type="primary" size="mini" @tap="gotoSubFrame">跳轉到子頁面</button>
</view>
<script>
export default {
methods{
gotoSubFrame(){
//建立監聽事件
uni.$on('value1', function(e){
//關閉目前監聽(防止浪費資源,先關閉後執行其他操作)
uni.$off('value1');
console.log("子頁面回傳資料為:"+e);
});
//跳轉到子頁面
uni.navigateTo({
url: 'subFrame'
});
}
}
}
</script>
子頁面代碼:
<view>
<button type="primary" size="mini" @tap="sendValue">向父頁面傳值并傳回父頁面</button>
</view>
<script>
export default {
methods{
sendValue(){
//傳值
uni.$emit('value1',"啦啦啦,這是子頁面回傳值");
//傳回父頁面
uni.navigateBack();
}
}
}
</script>
運作後點選按鈕,背景列印資料:
子頁面回傳資料為:啦啦啦,這是子頁面回傳值