首頁  >  文章  >  web前端  >  uniapp如何取得dom節點

uniapp如何取得dom節點

藏色散人
藏色散人原創
2020-12-09 10:40:138572瀏覽

uniapp取得dom節點的方法:1、透過「let dom=query.select(selector)」方法取得第一個符合選擇器的節點;2、使用「letdoms=query.selectAll(selector) ”方法獲取所有節點。

uniapp如何取得dom節點

本教學操作環境:windows7系統、uni-app2.5.1版本、thinkpad t480電腦。

推薦(免費):uni-app開發教學

uni-app 取得DOM 節點

【參考官網: https://uniapp.dcloud.io/api/ui/nodes-info?id=selectorqueryexec】

一、如何取得SelectorQuery物件實例:

let query=uni.createSelectorQuery();

功能:傳回一個SelectorQuery物件的實例,該實例用來查詢DOM節點的資訊。

注意事項:

(1)此方法需要在生命週期mounted後進行呼叫。

(2)nvue技術不支援此方法。

二、如何取得DOM節點:

1、取得符合選擇器的第一個節點:

let dom=query.select(selector)

2、取得符合選擇器的所有節點:

letdoms=query.selectAll(selector)

上述兩個方法都傳回NodesRef物件實例,該實例用來取得DOM節點的資訊。

三、如何取得DOM節點的資訊:(以doms為例)

1、取得DOM節點的佈局位置資訊:

doms.boundingClienRect(function(res){
//res:{left,top,right,bottom,width,height}
}).exec(function(){
//上述布局位置信息获取成功后执行的回调函数
})

2、取得DOM節點的捲動位置資訊:

doms.scrollOffset(function(){
//res:{scrollLeft,scrollTop}
}).exec(function(){
//上述滚动位置信息获取成功后执行的回调函数
})

3、取得DOM節點的所有資訊:

doms.fields({
rect:true,   //是否返回节点布局位置信息{left,top,right,bottom}
size:true,  //是否返回节点尺寸信息{width,height}
scrollOffset:true //是否返回节点滚动信息{scrollLeft,scrollTop}
},function(res){
//res 可以返回第一个参数对象中指定为true的相关信息
}).exec(function(){
//上述节点信息获取成功后执行的回调函数
})

四、程式碼實例

1、範例1: d477f9ce7bf77f53fbcf36bec1b69b7a中有多個類別名為leftItem的節點,如何取得這些節點距離頂部的距離,並將這些距離賦給一個在資料區已經定義好的名為leftItemTop的陣列。

uni.createSelectorQuery().selectAll(".leftItem").boundingClienRect(res=>{
this.leftItemTop=res.map(item=>item.top)
}).exec(()=>{
console.log(this.leftItemTop)
})

2、例2:cf02b64373d56bfa6005cf61bdd2cdf0中有多個類別名為rightItem的節點,如何取得這些節點的高度,並將這些高度賦值給一個在資料區已經定義好的名為rightItem的陣列。

uni.createSelectorQuery().selectAll(".rightItem").fields({
size:true
},res=>{
this.rightItemHeight=res.map(item=>{item.height})
}).exec(()=>{
console.log(this.rightItemHeight)
})

五、資料渲染DOM造成的非同步問題:

【參考官網:https://cn.vuejs.org/v2/api/#vm-nextTick】

【推薦閱讀:https://segmentfault.com/a/1190000012861862】

**問題:**某個資料區的變數temp講影響DOM結構的渲染,且規定變數更新後直到DOM結構重新渲染完成後還需要做一個其他的操作,則這些其他的操作如何保證在DOM結構重新渲染完成後才發生?

解決方案:這些需要DOM結構重新渲染完成後才發生的操作必須寫在this&nextTick(function(){})格式的回呼函數中。

<block v-for="(item,index) in domData">
<view class="domItem">{{item.title}}</view>
</block>

我們就說上述結構是基於數據domData驅動的結構,變數domData需要先從介面取得必要的數據,再渲染到DOM結構中。

data(){
return{
domData:[], //用于储存从接口中获取的DOM数据
domItemWidth:[] //用于储存获取的DOM结构的宽度
}
}

當變數domData從介面得到資料後,也必須保證成功渲染了DOM結構之後,才能去取得這些結構的寬度,因此要將後續的操作用this.nextTick(function(){ })包起來,既書寫在this.nextTick(function(){})的回呼函數內部。

上述例子的程式碼如下:

uni.request({
url:"http://localhost:8080/......",
data:{.....},
success:res=>{
this.domData=res.data;
this.nextTick(()=>{//该格式保证了domData已经得到接口数据并成功渲染DOM结构
uni.createSelectorQuery().selectAll(".domItem").fields({
size:true
},res=>{
this.domItemWidth=res.map(item=>item.width)
}).exec(()=>{
console.log(this.domItemWidth)
})
})
}
})

以上是uniapp如何取得dom節點的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:uniapp如何賦值下一篇:uniapp如何賦值