gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

renderjs有什么用?聊聊uniapp中用renderjs的一些細節

本篇文章帶大家了解一下renderjs,通過在uniapp中使用better-scroll,聊聊renderjs的一些細節,希望對大家有所幫助!

renderjs有什么用?聊聊uniapp中用renderjs的一些細節

包含內容:

  • 使用renderjs在app端獲取dom

  • renderjs和service層之間的通信

  • renderjs中如何接收到service層中的自定義id(重點,官方文檔沒有的)

一、renderjs

1.1 renderjs的概念

  • 官方文檔

  • 運行在視圖層的js,只支持app-vue和h5(簡單來說就是開了另外一條線程)

1.2 renderjs的作用

  • 大幅降低邏輯層和視圖層的通訊損耗,提供高性能視圖交互能力(減少通訊損耗提升性能,例如一些手勢或canvas動畫的場景)

  • 在視圖層操作dom,運行for web的js庫(可以操作dom,意味著擁有window、document等這些全局變量,在app-vue的service層沒有這些)

1.3 renderjs的使用

  • 官方文檔給出的示例 (內容較為詳細,也可以看我接下來的簡要概括)
  • 在原先的script標簽的同級新增一個script,設置lang=renderjsmodule=(值任意,相當于命名空間,之后會根據這個名字調用其中的方法)
  • 新script標簽內的結構和之前的幾乎一致,有幾點不同的需要注意:
    1. 生命周期不和uniapp相同,而是和vue相同,onLoad應該寫成原生vue的created
    2. 官方文檔好像說了renderjs中無法使用uni這個全局變量,具體哪個地方忘了。實測結果是:部分可以。例如uni.upx2px是可以用的,uni.request不可以,所以使用uni全局變量之前先輸出看一下有沒有
  • 在template中使用一開始給renderjs的命名加.的方式調用其中的方法
<template>   <view>     <button @tap="test.handleClick">點擊</button>   </view> </template>  <script>   export default {     // 原先的script,這里被稱為service層   } </script>  <script module="test">   export default {     data() {       return {}     },     methods: {       handleClick(event, ownerInstance) {         // event是事件對象         // ownerInstance和this.$ownerInstance是一樣的,用來調用service層的方法         console.log('點擊了按鈕')       }     },     created() {       console.log('renderjs初始化完畢')     }   } </script>

二、renderjs和service層的通信

具體分為三部分:

  • 在template中通過用戶手動操作觸發事件

  • 在service層中調用方法

  • 在renderjs中調用方法

從renderjs到service層:通過this.$ownerInstance.callMethod()方法可以調用service中的方法,第一個參數是方法名,第二個參數是傳過去的參數

<template>   <view>     <button @tap="test.onClick">點擊</button>   </view> </template>  <script>   export default {     methods: {       acceptDataFromRenderjs(data) {         console.log('從renderjs中接收到的數據', data)       }     }   } </script>  <script module="test">   export default {     data() {       return {}     },     methods: {       onClick(event, ownerInstance) {         ownerInstance.callMethod('acceptDataFromRenderjs', { content: '測試文字' })         // 或this.$ownerInstance.callMethod('acceptDataFromRenderjs', { content: '測試文字' })         // 需要注意的是:只有通過在template中用戶手動操作觸發renderjs的方法參數是這兩個:event, ownerInstance;         // 通過其他方法觸發的函數參數不一樣,后面會說       }     }   } </script>

從service層到renderjs:

這里就需要template了,首先在template中綁定一個service中定義的值,然后在同樣的位置增加:change:(屬性名)=(觸發的方法)來實現通信。

簡單來說就是service負責數據的更改,通過template監聽數據的變化來通知renderjs

<template>   <view>     // prop是個名字,可以隨意改,注意:change:[name]這兩個名字需要相同就行了     <text :prop="options" :change:prop="test.onChange">無內容</text>     <button @tap="changeOptionFn">點擊修改options</button>   </view> </template>  <script>   export default {     data() {       return {         options: {           // 這里存放準備傳遞給renderjs的數據           token: null,           num: 1         }       }     },     methods: {       changeOptionFn() {         this.options = {           // 這個地方我用時間戳來修改token,用于觸發change,實際需要傳遞的數據是num           token: Date.now(),           num: Math.random()         }       }     }   } </script>  <script module="test">   export default {     methods: {       onChange(newValue, oldValue, ownerInstance, instance) {         console.log('service層中的options發生變化')         console.log('新值', newValue)         console.log('舊值', oldValue)         // ownerInstance和this.$ownerInstance一樣,可用來向service層通信         // instance和ownerInstance的區別是:         // instance.$el指向的是觸發事件的那個節點;ownerInstance.$el指向當前vue文件中的根節點;         // instance的作用目前尚不明確,官方沒有給出用法       }     }   } </script>

在上面的例子中,prop初次綁定到節點時,事件不會觸發。

用戶首先通過點擊按鈕觸發changeOptionFn事件,函數中修改了this.options的值。

而在text節點監聽到綁定值發生了改變就會觸發test.onChange,從而實現service到renderjs的通信

上面的例子中有一點需要注意:在this.options中我定義了一個token屬性,每次修改時都將最新的時間戳賦值給他,這樣就保證了我每一次的點擊都會使options發生改變。

如果沒有這個token的話就會出現明明修改了options但是并未觸發onChange的情況。

了解js基礎的都知道,修改options是我是直接重新賦值的,改變了索引,所以即使我num值和原先的相同,他也應該做出改變(例如vue中的watch),但是事實并不是

所以可以推測出這個監聽數據改變監聽的是內部的屬性值,只有屬性的增刪改才能觸發回調。(如果一開始綁定的就是基礎數據類型的話,直接修改就好了)

故,當綁定值使用對象的時候,在對象中增加一個每次都一定會變的值,即可保證事件的觸發(如上例中的token

補充一點:進行過prop綁定的值,觸發過一次監聽事件之后,在renderjs中可以直接使用this.屬性名的方式獲取到

例如上面的代碼中,options改變導致test.onChange觸發一次之后,在renderjs中可以直接通過this.options獲取到值

三、renderjs中如何接收到service層中的自定義id

3.1 在renderjs中使用better-scroll

做過app-vue開發的話應該知道在service層中沒有document對象,無法獲取dom節點。

所以引用一些外部js的時候,如果初始化的時候需要傳入一個選擇器的,那基本就斷定用到了document對象獲取節點。

這時候就需要用到renderjs了,首先看一個better-scroll的示例。根據官方給出的示例做一些修改,我們可以得到以下代碼

<template>   <view id="my-scroll">     <view><slot /></view>   </view> </template>  <script>   export default {} </script>  <script module="BScroll">   export default {     mounted() {       // 如果這個插件支持ESModule的話就不用這么寫,直接import導入就好了       if (typeof window.BScroll == 'function') return this.initBScroll()       const script = document.createElement('script')       script.src = 'static/better-scroll.core.min.js'       script.onload = this.initBScroll       document.head.appendChild(script)     },     methods: {       initBScroll() {         this.bs = new BScroll(document.querySelector('#my-scroll'))       }     }   } </script>

3.2 better-scroll自定義id

重點來了,上面的例子中雖然實現了效果,但是也出現了一個問題:id是固定的。

如果我在同一頁面中多次使用該組件,就會導致出現多個重復id,導致無法預料的錯誤。

在官方給出的示例中,包括我研究過的插件市場中的很多項目,都是使用固定的id。

解決的方法就是由外部傳入自定義id或是由內部生成隨機id。那么應該如何在renderjs中如何接收到service層中的自定義id呢

下面我給出的方法算是我自己測試過最有效的方法了,直接看代碼

<template>   <view :id="bsId" :prop="bsId" :change:prop="BScroll.initBScroll">     <view><slot /></view>   </view> </template>  <script>   export default {     props: {       bsId: {         type: String,         default: 'bs-container'       }     }   } </script>  <script module="BScroll">   export default {     mounted() {       if (typeof window.BScroll == 'function') return this.initBScroll()       const script = document.createElement('script')       script.src = 'static/better-scroll.core.min.js'       script.onload = this.initBScroll       document.head.appendChild(script)     },     methods: {       initBScroll() {         this.bs?.destroy()         this.bs = new BScroll(document.querySelector(`#${this.$ownerInstance.$vm.bsId}`))       }     }   } </script>

在父級中傳入自定義的bsId,組件接收到之后將其作為元素id。

執行順序和之前一樣:在renderjs的mounted中加載外部js,加載完成后進行初始化操作,通過this.$ownerInstance.$vm.bsId獲取到service層中的bsId完成操作

同時,bsId也綁定了prop,監聽到改變時會重新進行初始化操作,所以在初始化的方法第一行加入了this.bs?.destroy(),如果實例已存在就先銷毀。

還記得一開始就說過的renderjs只支持app-vue和h5嗎,這里主要說的是app端,因為如果是h5端的話,是可以在service中直接使用document的,壓根不用這么麻煩。

這里還有一點需要注意的::prop="bsId" :change:prop="BScroll.initBScroll"

實測,如果不寫這行代碼,也就是不進行綁定prop的操作的話,是無法獲取到this.$ownerInstance.$vm.bsId。(app端是這樣,h5端不寫這個也可以,但是h5端壓根也用不著這種方法)

推薦:《uniapp教程》

贊(3)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
欧美 国产 综合| 草草久久久无码国产专区| 久久久久久久久久久久久国产精品 | 男人天堂a在线| 大片在线观看网站免费收看| 日本丰满少妇黄大片在线观看| 想看黄色一级片| 国产999免费视频| 99热都是精品| 真人抽搐一进一出视频| 欧美视频在线观看视频| 欧美黄网站在线观看| 国产第一页视频| 欧美伦理片在线看| 6080国产精品| 男人天堂手机在线视频| 男人添女人下面高潮视频| 亚洲 高清 成人 动漫| 国产精品乱码久久久久| 日本中文字幕二区| 日韩欧美猛交xxxxx无码| 久久婷婷五月综合色国产香蕉| 国产免费成人在线| 国产在线观看中文字幕| 老司机激情视频| 成年人小视频网站| 欧洲在线免费视频| 国产无限制自拍| 中文字幕中文在线| www.国产亚洲| 十八禁视频网站在线观看| 中文字幕66页| 青青艹视频在线| 久久久国产精华液999999 | 免费观看中文字幕| 91猫先生在线| 黄黄视频在线观看| 日日噜噜夜夜狠狠| 日本国产在线播放| 久久精品在线免费视频| 成年人在线观看视频免费| 无码熟妇人妻av在线电影| av在线免费看片| 动漫av免费观看| 黄色大片中文字幕| av电影一区二区三区| 精品999在线| 久久综合色视频| 永久免费网站视频在线观看| 欧美三级午夜理伦三级富婆| 日本wwww视频| 欧美激情 国产精品| 粉嫩av一区二区三区天美传媒| 69久久久久久| 国产高潮免费视频| 999精品视频在线| 日本老熟妇毛茸茸| 国产精品亚洲αv天堂无码| 亚洲 欧美 综合 另类 中字| 9l视频自拍9l视频自拍| 在线无限看免费粉色视频| 久久99999| 一区二区三区四区毛片| 国产精品区在线| 亚洲国产高清av| 国产福利在线免费| 欧美精品 - 色网| 精品91一区二区三区| 亚洲国产精品影视| 久久人妻无码一区二区| 人妻无码一区二区三区四区| 免费看欧美一级片| 日韩精品―中文字幕| 北条麻妃在线视频观看| 免费观看成人在线视频| 自拍偷拍一区二区三区四区| 色婷婷一区二区三区在线观看| 涩涩网站在线看| 成人毛片100部免费看| 你真棒插曲来救救我在线观看| 免费视频爱爱太爽了| 国产裸体舞一区二区三区| 亚洲污视频在线观看| 欧美少妇一级片| 精品国产一区三区| 男人插女人下面免费视频| 亚洲欧美一区二区三区不卡| 欧美日韩福利在线| 国产三级三级看三级| 热这里只有精品| 欧美精品一区二区三区免费播放| 日本黄大片一区二区三区| 日韩不卡一二区| 日本精品免费在线观看| 亚洲精品mv在线观看| 日本福利视频在线| 最新免费av网址| 国产又黄又大又粗视频| 大桥未久一区二区三区| 黑森林福利视频导航| 91精品一区二区三区四区| 99爱视频在线| 超碰人人爱人人| 97超碰成人在线| 国产精品无码专区av在线播放| 深夜做爰性大片蜜桃| 国产精品亚洲αv天堂无码| 特级毛片在线免费观看| 免费在线观看毛片网站| 亚洲理论电影在线观看| 日韩 欧美 自拍| 国产视频1区2区3区| 黄色国产精品视频| 国产美女主播在线播放| 六月婷婷激情网| 日日夜夜精品视频免费观看| 在线免费观看av的网站| 999香蕉视频| av动漫在线观看| 国产日本在线播放| 91.com在线| 日韩成人三级视频| 欧美 国产 精品| 男插女免费视频| 午夜大片在线观看| 日本高清一区二区视频| 污污网站在线观看视频| 香蕉视频禁止18| 日本爱爱免费视频| 看欧美ab黄色大片视频免费| 久久久久狠狠高潮亚洲精品| 久久久久狠狠高潮亚洲精品| 青青青国产在线观看| 香港三级韩国三级日本三级| 国产h视频在线播放| 日韩精品视频久久| 午夜免费福利在线| 人人爽人人爽av| 成人高清在线观看视频| 免费成人进口网站| 久久综合久久网| av免费播放网址| 天天干天天干天天干天天干天天干| 欧美性猛交xxx乱久交| 中文字幕22页| 日韩欧美视频免费在线观看| 丁香色欲久久久久久综合网| 国产精品久久中文字幕| 国产三级三级三级看三级| 日韩在线不卡一区| 久久综合亚洲精品| 黄在线观看网站| 久久精品一卡二卡| 人妻久久久一区二区三区| www.99av.com| 成人免费a级片| 日韩av在线综合| 午夜探花在线观看| 99热在线这里只有精品| 日本黄色的视频| 国产传媒久久久| 538在线视频观看| 亚洲精品少妇一区二区| 青青草av网站| 国产一二三四区在线观看| av免费在线播放网站| 久久www视频| 中文字幕22页| www.四虎成人| 欧美大黑帍在线播放| 五月婷婷六月合| 久久久性生活视频| 国产高潮呻吟久久久| 久草精品在线播放| 妺妺窝人体色777777| 中文字幕22页| www日韩视频| 日本午夜激情视频| 一道本在线观看视频| 五月天婷婷亚洲| 国产又大又黄又粗的视频| 精品少妇人妻av免费久久洗澡| 男人的天堂成人| 777一区二区| 色乱码一区二区三区在线| 男人操女人免费| 免费欧美一级视频| 国产在线播放观看| 日韩精品一区二区免费| 日本丰满大乳奶| 一级日本黄色片| 在线不卡一区二区三区| 成年人在线观看视频免费| 欧美三级午夜理伦三级| 777久久久精品一区二区三区| 日韩一级片免费视频| 男人天堂手机在线视频| 国产a级片网站| 亚洲熟妇av日韩熟妇在线| 国产美女网站在线观看|