uni-app中renderjs使用的方式淺析
前言
對(duì)于UNI APP端的開發(fā)而言,由于上并沒有document,不能進(jìn)行相關(guān)的DOM操作,同時(shí)有關(guān)DOM渲染的第三方庫(kù)(echart、openlayer等)也無法有效的使用,因此官方推出了renderjs方案,來解決上述問題。
renderjs是一個(gè)運(yùn)行在視圖層的js
renderjs的主要作用有2個(gè):
大幅降低邏輯層和視圖層的通訊損耗,提供高性能視圖交互能力
在視圖層操作dom,運(yùn)行for web的js庫(kù)
renderjs和service層的通信
具體分為三部分:
1.在template中通過用戶手動(dòng)操作觸發(fā)事件
2.在service層中調(diào)用方法
3.在renderjs中調(diào)用方法
從renderjs到service層:通過this.$ownerInstance.callMethod()方法可以調(diào)用service中的方法,第一個(gè)參數(shù)是方法名,第二個(gè)參數(shù)是傳過去的參數(shù)
使用方式
設(shè)置 script 節(jié)點(diǎn)的 lang 為 renderjs
script的module的名稱可以隨便取,module=(值任意,相當(dāng)于命名空間,之后會(huì)根據(jù)這個(gè)名字調(diào)用其中的方法),但是change:參數(shù)名稱必須和module保持一致,雖然不會(huì)阻斷renderjs的運(yùn)行,但是會(huì)報(bào)錯(cuò),也會(huì)導(dǎo)致無法捕獲數(shù)據(jù)的變化
<script module="test" lang="renderjs">
export default {
mounted() {
// ...
},
methods: {
// ...
}
}
</script><template>
<view>
<!-- prop是個(gè)名字,可以隨意改,注意:change:[name]這兩個(gè)名字需要相同就行了 -->
<!-- 從service層到renderjs:首先在template中綁定一個(gè)service中定義的值,然后在同樣的位置增加:change:(屬性名)=(renderjs的module名.觸發(fā)的方法)來實(shí)現(xiàn)通信。
簡(jiǎn)單來說就是service負(fù)責(zé)數(shù)據(jù)的更改,通過template監(jiān)聽數(shù)據(jù)的變化來通知renderjs
this.$ownerInstance.callMethod方法必須通過點(diǎn)擊事件執(zhí)行-->
<!-- msg是要向renderjs發(fā)送的數(shù)據(jù),testRenderjs 為renderjs模塊名稱,onChange是renderjs中的監(jiān)聽方法 -->
<view :prop="msg" :change:prop="testRenderjs.onChange" id="renderjs-view">{{msg}}</view>
<button @tap="changeMsgFn">點(diǎn)擊修改options</button>
<button @tap="testRenderjs.emitData">直接調(diào)用renderjs中的emitData方法</button>
</view>
</template>
<script>
// 原先的script,這里被稱為service層
export default {
data() {
return {
// 這里存放準(zhǔn)備傳遞給renderjs的數(shù)據(jù)
msg: "我是service層原來的msg"
}
},
methods: {
// 觸發(fā)service層 出入renderjs數(shù)據(jù)改變
changeMsgFn() {
// 修改msg 觸發(fā)change
this.msg = "msg的值變了"
},
// 接收renderjs發(fā)回的數(shù)據(jù)
acceptDataFromRenderjs(data) {
console.log('從renderjs中接收到的數(shù)據(jù)', data)
this.msg = data.content
}
}
}
</script>
<!-- testRenderjs 為renderjs模塊名稱,lang固定寫法 -->
<script module="testRenderjs" lang="renderjs">
export default {
data() {
return {
content:"我是來自renderjs的數(shù)據(jù)"
}
},
created() {
console.log('renderjs初始化完畢')
},
mounted() {
const view = document.getElementById('renderjs-view')
const button = document.createElement('button')
button.innerText = '一個(gè)按鈕'
view.appendChild(button)
},
methods: {
// 接收邏輯層service層發(fā)送的數(shù)據(jù)
onChange(newValue, oldValue, ownerInstance, instance) {
console.log('service層中的options發(fā)生變化')
console.log('新值newValue', newValue)
console.log('舊值oldValue', oldValue)
// ownerInstance和this.$ownerInstance一樣,可用來向service層通信
// instance和ownerInstance的區(qū)別是:
// instance.$el指向的是觸發(fā)事件的那個(gè)節(jié)點(diǎn);ownerInstance.$el指向當(dāng)前vue文件中的根節(jié)點(diǎn);
// instance的作用目前尚不明確,官方?jīng)]有給出用法
},
// 發(fā)送數(shù)據(jù)到service層
emitData(event, ownerInstance) {
// event是事件對(duì)象
ownerInstance.callMethod('acceptDataFromRenderjs', {
content: this.content
})
// 或者
/* this.$ownerInstance.callMethod('acceptDataFromRenderjs',{
content:this.content
}) */
// 需要注意的是:只有通過在template中用戶手動(dòng)操作觸發(fā)renderjs的方法參數(shù)是這兩個(gè):event, ownerInstance;通過其他方法觸發(fā)的函數(shù)參數(shù)不一樣
}
}
}
</script>
補(bǔ)充:使用時(shí)的注意事項(xiàng)
- 目前僅支持內(nèi)聯(lián)使用。
- 不要直接引用大型類庫(kù),推薦通過動(dòng)態(tài)創(chuàng)建 script 方式引用。
- 可以使用 vue 組件的生命周期不可以使用 App、Page 的生命周期
- 視圖層和邏輯層通訊方式與 WXS 一致,另外可以通過 this.$ownerInstance 獲取當(dāng)前組件的 ComponentDescriptor 實(shí)例。
- 觀測(cè)更新的數(shù)據(jù)在視圖層可以直接訪問到。
- APP 端視圖層的頁(yè)面引用資源的路徑相對(duì)于根目錄計(jì)算,例如:./static/test.js。
- APP 端可以使用 dom、bom API,不可直接訪問邏輯層數(shù)據(jù),不可以使用 uni 相關(guān)接口(如:uni.request)
- H5 端邏輯層和視圖層實(shí)際運(yùn)行在同一個(gè)環(huán)境中,相當(dāng)于使用 mixin 方式,可以直接訪問邏輯層數(shù)據(jù)。
總結(jié)
到此這篇關(guān)于uni-app中renderjs使用方式的文章就介紹到這了,更多相關(guān)uni-app中renderjs使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Kendo Grid editing 自定義驗(yàn)證報(bào)錯(cuò)提示的解決方法
Kendo UI是一個(gè)強(qiáng)大的框架用于快速HTML5 UI開發(fā)。基于最新的HTML5、CSS3和JavaScript標(biāo)準(zhǔn)。今天小編通過分享本文給大家介紹Kendo Grid editing 自定義驗(yàn)證報(bào)錯(cuò)提示的解決方法2016-11-11
JavaScript 事件屬性綁定帶參數(shù)的函數(shù)
在JavaScript中,為了實(shí)現(xiàn)表現(xiàn)和控制相分離,可以通過0級(jí)的DOM事件屬性或者2級(jí)的事件模型來實(shí)現(xiàn),不過這兩者在針對(duì)某個(gè)事件類型調(diào)用相應(yīng)的事件句柄的時(shí)候,不能給事件句柄提供參數(shù),也就是說,事件屬性的值只能是一個(gè)函數(shù)引用。2009-03-03
微信小程序報(bào)錯(cuò): thirdScriptError的錯(cuò)誤問題
這篇文章主要介紹了微信小程序報(bào)錯(cuò): thirdScriptError,本文給大家分享解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
JavaScript原型鏈與繼承操作實(shí)例總結(jié)
這篇文章主要介紹了JavaScript原型鏈與繼承操作,結(jié)合實(shí)例形式總結(jié)分析了javascript原形鏈與繼承的相關(guān)概念、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2018-08-08
20分鐘輕松創(chuàng)建自己的Bootstrap站點(diǎn)
這篇文章主要教大家如何在短短的20分鐘內(nèi)輕松創(chuàng)建自己的Bootstrap站點(diǎn),學(xué)會(huì)使用twitter bootstrap建立一個(gè)站點(diǎn),從而鞏固Bootstrap一系列基礎(chǔ)知識(shí),感興趣的小伙伴們可以參考一下2016-05-05
Express實(shí)現(xiàn)前端后端通信上傳圖片之存儲(chǔ)數(shù)據(jù)庫(kù)(mysql)傻瓜式教程(一)
這篇文章主要介紹了Express實(shí)現(xiàn)前端后端通信上傳圖片存儲(chǔ)數(shù)據(jù)庫(kù)(mysql)傻瓜式教程(一),需要的朋友可以參考下2015-12-12
微信JS-SDK updateAppMessageShareData安卓不能自定義分享詳解
這篇文章主要介紹了微信JS-SDK updateAppMessageShareData安卓不能自定義分享詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Javascript實(shí)現(xiàn)div層漸隱效果的方法
這篇文章主要介紹了Javascript實(shí)現(xiàn)div層漸隱效果的方法,涉及javascript操作頁(yè)面元素與樣式變化的相關(guān)技巧,需要的朋友可以參考下2015-05-05

