uniapp中renderjs使用與傳值問題
前言
需求是用openlayers在uniapp框架下做一個(gè)移動(dòng)gis類的軟件,選擇用renderjs實(shí)現(xiàn)地圖與dom的交互,一開始也是小白,通過百度資料以及一步步測試后掌握了renderjs的使用,以及地圖功能的實(shí)現(xiàn)。




一、renderjs的作用是什么?
renderjs 主要服務(wù)于APP,因?yàn)閡ni-app為vue+js+html進(jìn)行編寫,整個(gè)是h5的技術(shù)棧。而app上并沒有document等基礎(chǔ)對象。那么,涉及到這些的前端類庫就無法使用,例如html2、canvas、canvas2、image。而要用這些怎么辦,這是用就出現(xiàn)了renderjs這種視圖層工具來進(jìn)行渲染。
運(yùn)行在視圖層的js
大幅降低邏輯層和視圖層的通訊損耗,提供高性能視圖交互能力(減少通訊損耗提升性能,例如一些手勢或canvas動(dòng)畫的場景)
在視圖層操作dom,運(yùn)行for web的js庫(可以操作dom,意味著擁有window、document等這些全局變量,在app-vue的service層沒有這些)
二、renderjs怎樣使用?
1.原生層數(shù)據(jù)通過監(jiān)聽傳入renderjs層(可以通過調(diào)用原生層的方法觸發(fā))
2.直接調(diào)用renderjs層方法傳出數(shù)據(jù)
三、測試代碼(借用網(wǎng)上一段代碼,寫的很全面)
<template>
<view>
<view :msg="msg" :change:msg="renderScript.receiveMsg" class="renderjs" id="renderjs-view">
{{msg}}
</view>
<button @click="renderScript.emitData">直接調(diào)用renderjs中的emitData的方法</button>
<button @click="changeMsg" class="app-view">改變msg的值,直接調(diào)用renderjs中receiveMsg的值</button>
<button @click="renderScript.renferMsg">通過renderjs改變msg的值,同時(shí)調(diào)用renderjs中的emitData的方法</button>
</view>
</template>
<script>
export default {
data() {
return {
msg: '我是service層原來的msg',
};
},
methods: {
// 觸發(fā)邏輯層出入renderjs數(shù)據(jù)改變
changeMsg() {
this.msg = "msg值改變了";
},
// 接收renderjs發(fā)回的數(shù)據(jù)
receiveRenderData(val) {
console.log('renderjs返回的值-->', val);
},
//接收renderjs發(fā)回的數(shù)據(jù),同時(shí)觸發(fā):change:msg,調(diào)用enderjs中的emitData的方法
serviceClick(e){
this.msg=e
}
}
};
</script>
<script module="renderScript" lang="renderjs">
export default {
data() {
return {
name: '我是renderjs數(shù)據(jù)'
}
},
methods: {
renferMsg(event, ownerInstance) {
// 調(diào)用 service層的serviceClick方法,傳值
console.log(event,ownerInstance)
ownerInstance.callMethod('serviceClick', {
test: '這是點(diǎn)擊renderjs的區(qū)域,向service層傳遞變量'
})
},
// 接收邏輯層發(fā)送的數(shù)據(jù)
receiveMsg(newValue, oldValue, ownerVm, vm) {
console.log('msg變化了newValue', newValue)
console.log('msg變化了oldValue', oldValue)
console.log('msg變化了ownerVm', ownerVm)
console.log('msg變化了vm', vm)
},
// 發(fā)送數(shù)據(jù)到邏輯層
emitData(e, ownerVm) {
ownerVm.callMethod('receiveRenderData', this.name)
}
}
};
</script>注意:1.在renderjs層不能使用uni或其他框架的API,例如uni.request、uni.getlocation等等方法,需在原生層調(diào)用后觸發(fā)監(jiān)聽將數(shù)據(jù)傳入。
2.在APP端renderjs層的data與原生層的data互不相干
3.this.$ownerInstance.callMethod方法必須通過點(diǎn)擊事件執(zhí)行
4.地圖方法都要寫在renderjs層中,不能使用子組件
補(bǔ)充:uniapp 中renderjs傳值問題
需要自己自定義一個(gè)按鈕,點(diǎn)擊按鈕后才能獲取到值。renderjs 代碼頁面
<template>
<view class="map-wrap">
<view id="map-box">
</view>
<view @click="mapbox.emitData" style="position: absolute; bottom: 50px;left: 25%; z-index: 999;display: none;">
確認(rèn)
</view>
</view>
</template>
//renderjs 模式
<script>
export default {
data() {
return {
msg: '',
};
},
methods: {
// 觸發(fā)邏輯層出入renderjs數(shù)據(jù)改變
// 接收renderjs發(fā)回的數(shù)據(jù)
receiveRenderData(val) {
console.log(val)
this.$eventHub.$emit('dot', val);
uni.navigateBack({
delta: 1
})
}
}
};
</script>
<script module="mapbox" lang="renderjs">
export default {
data: {
return () {
dot: 123
}
},
methods: {
//點(diǎn)擊函數(shù)
emitData(e, ownerVm) {
ownerVm.callMethod('receiveRenderData', this.dot)
}
}
}
</script>主頁面代碼,在onload里面接收renderjs頁面的值
onLoad() {
var t = this;
this.$eventHub.$on('dot', data => {
console.log(data);
//將數(shù)組轉(zhuǎn)為字符串
//t.dot = t.getString(data)
//字符串轉(zhuǎn)數(shù)組
//console.log(eval(t.dot))
});
},總結(jié)
到此這篇關(guān)于uniapp中renderjs使用與傳值問題的文章就介紹到這了,更多相關(guān)uniapp renderjs使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS如何判斷移動(dòng)端訪問設(shè)備并解析對應(yīng)CSS
本文為大家詳細(xì)介紹下JS如何判斷移動(dòng)端訪問設(shè)備并解析對應(yīng)CSS,感興趣的朋友可以參考下2013-11-11
js實(shí)現(xiàn)表格拖動(dòng)選項(xiàng)
這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)表格拖動(dòng)選項(xiàng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
理解Javascript_07_理解instanceof實(shí)現(xiàn)原理
在《Javascript類型檢測》一文中講到了用instanceof來用做檢測類型,讓我們來回顧一下2010-10-10
移動(dòng)端H5喚起APP的寫法實(shí)例(IOS、android)
最近在做掃碼之后的h5頁面喚醒App的功能,所以記錄一下,這篇文章主要給大家介紹了關(guān)于移動(dòng)端H5喚起APP的相關(guān)資料,需要的朋友可以參考下2021-07-07
用javascript刪除當(dāng)前行,添加行(示例代碼)
這篇文章主要介紹了用javascript刪除當(dāng)前行,添加行的示例代碼。需要的朋友可以過來參考下,希望對大家有所幫助2013-11-11
JavaScript組合設(shè)計(jì)模式--改進(jìn)引入案例分析
這篇文章主要介紹了JavaScript組合設(shè)模式改進(jìn)引入案例,結(jié)合實(shí)例形式分析了JavaScript組合設(shè)計(jì)模式特性改進(jìn)的引入示例相關(guān)操作技巧,需要的朋友可以參考下2020-05-05

