uni-app中renderjs使用的方式淺析
前言
對于UNI APP端的開發(fā)而言,由于上并沒有document,不能進行相關(guān)的DOM操作,同時有關(guān)DOM渲染的第三方庫(echart、openlayer等)也無法有效的使用,因此官方推出了renderjs方案,來解決上述問題。
renderjs是一個運行在視圖層的js
renderjs的主要作用有2個:
大幅降低邏輯層和視圖層的通訊損耗,提供高性能視圖交互能力
在視圖層操作dom,運行for web的js庫
renderjs和service層的通信
具體分為三部分:
1.在template中通過用戶手動操作觸發(fā)事件
2.在service層中調(diào)用方法
3.在renderjs中調(diào)用方法
從renderjs到service層:通過this.$ownerInstance.callMethod()方法可以調(diào)用service中的方法,第一個參數(shù)是方法名,第二個參數(shù)是傳過去的參數(shù)
使用方式
設(shè)置 script 節(jié)點的 lang 為 renderjs
script的module的名稱可以隨便取,module=(值任意,相當于命名空間,之后會根據(jù)這個名字調(diào)用其中的方法),但是change:參數(shù)名稱必須和module保持一致,雖然不會阻斷renderjs的運行,但是會報錯,也會導(dǎo)致無法捕獲數(shù)據(jù)的變化
<script module="test" lang="renderjs"> export default { mounted() { // ... }, methods: { // ... } } </script>
<template> <view> <!-- prop是個名字,可以隨意改,注意:change:[name]這兩個名字需要相同就行了 --> <!-- 從service層到renderjs:首先在template中綁定一個service中定義的值,然后在同樣的位置增加:change:(屬性名)=(renderjs的module名.觸發(fā)的方法)來實現(xiàn)通信。 簡單來說就是service負責(zé)數(shù)據(jù)的更改,通過template監(jiān)聽數(shù)據(jù)的變化來通知renderjs this.$ownerInstance.callMethod方法必須通過點擊事件執(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">點擊修改options</button> <button @tap="testRenderjs.emitData">直接調(diào)用renderjs中的emitData方法</button> </view> </template> <script> // 原先的script,這里被稱為service層 export default { data() { return { // 這里存放準備傳遞給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 = '一個按鈕' 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ā)事件的那個節(jié)點;ownerInstance.$el指向當前vue文件中的根節(jié)點; // instance的作用目前尚不明確,官方?jīng)]有給出用法 }, // 發(fā)送數(shù)據(jù)到service層 emitData(event, ownerInstance) { // event是事件對象 ownerInstance.callMethod('acceptDataFromRenderjs', { content: this.content }) // 或者 /* this.$ownerInstance.callMethod('acceptDataFromRenderjs',{ content:this.content }) */ // 需要注意的是:只有通過在template中用戶手動操作觸發(fā)renderjs的方法參數(shù)是這兩個:event, ownerInstance;通過其他方法觸發(fā)的函數(shù)參數(shù)不一樣 } } } </script>
補充:使用時的注意事項
- 目前僅支持內(nèi)聯(lián)使用。
- 不要直接引用大型類庫,推薦通過動態(tài)創(chuàng)建 script 方式引用。
- 可以使用 vue 組件的生命周期不可以使用 App、Page 的生命周期
- 視圖層和邏輯層通訊方式與 WXS 一致,另外可以通過 this.$ownerInstance 獲取當前組件的 ComponentDescriptor 實例。
- 觀測更新的數(shù)據(jù)在視圖層可以直接訪問到。
- APP 端視圖層的頁面引用資源的路徑相對于根目錄計算,例如:./static/test.js。
- APP 端可以使用 dom、bom API,不可直接訪問邏輯層數(shù)據(jù),不可以使用 uni 相關(guān)接口(如:uni.request)
- H5 端邏輯層和視圖層實際運行在同一個環(huán)境中,相當于使用 mixin 方式,可以直接訪問邏輯層數(shù)據(jù)。
總結(jié)
到此這篇關(guān)于uni-app中renderjs使用方式的文章就介紹到這了,更多相關(guān)uni-app中renderjs使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CocosCreator骨骼動畫之龍骨DragonBones
這篇文章主要介紹了怎么在CocosCreator中使用骨骼動畫龍骨DragonBones,對骨骼動畫感興趣的同學(xué),可以試一下2021-04-04

2007/12/23更新創(chuàng)意無限,簡單實用(javascript log)

JavaScript中push(),join() 函數(shù) 實例詳解

一篇文章搞定JavaScript類型轉(zhuǎn)換(面試常見)