專案背景
因為專案較大,有五個介面,每個介面有四個子元件,每個子元件都有一個table表格,需求是每個介面的每個table滾動到頂端表頭吸頂,所以嘗試用vux做這種需求,
一、先聊js。
A.首先在vux可以這樣設定。
1.在state檔案中設定狀態。
techo:{
partsFixed:false,
repairFixed:false,
mateFixed:false,
outRepairFixed:false
}//吸頂狀態
複製程式碼
2.在action中commit狀態。
export const setTecho=function ({commit},data) {
commit(types.UPDATETECHO, {data})
}
複製程式碼
3.mutations中更新狀態。
[types.UPDATETECHO](state,{data}){
const {name,type,other} =data;
for (let i in state.techo) {
if(i===name){
state.techo[i]=other;
state.techo[name]=type;
}
}
}//更新吸頂狀態
複製程式碼
B.在介面中我們可以這樣操作。
1、在methods中我們可以定義一個回撥函式。
partScroll(){
const evalPart = this.$refs.evalPart,//evalPart為表格物件
evalTopTitle = document.querySelector('.fixedNav');//evalTopTitle為導航欄
if(evalPart){
let evalPartBottom = evalPart.getBoundingClientRect().bottom,
evalPartTop = evalPart.getBoundingClientRect().top,
evalTopTitleHeight = evalTopTitle.getBoundingClientRect().height;
evalPartTop<=evalTopTitleHeight && evalPartBottom>=evalTopTitleHeight?
this.$store.dispatch('setTecho',{name:"partsFixed",type:true,other:false})
:this.$store.dispatch('setTecho',{name:"partsFixed",type:false,other:false});
}
},
如果專案大,最好對函式進行封裝放到全域性混合。
scrollEvent(evalPart,evalTopTitle,name){
if(evalPart){//注意一定要對錶格物件進行判斷,因為表格是動態新增的,可能值為空,會報錯。
let evalPartBottom = evalPart.getBoundingClientRect().bottom,
evalPartTop = evalPart.getBoundingClientRect().top,
evalTopTitleHeight = evalTopTitle.getBoundingClientRect().height;
evalPartTop<=evalTopTitleHeight && evalPartBottom>=evalTopTitleHeight?
this.$store.dispatch('setTecho',{name,type:true,other:false})
:this.$store.dispatch('setTecho',{name,type:false,other:false});
}
},
partScroll(){
const evalPart = this.$refs.evalPart,//evalPart為表格物件
evalTopTitle = document.querySelector('.fixedNav');//evalTopTitle為導航欄
this.scrollEvent(evalPart,evalTopTitle,'partsFixed')
}
複製程式碼
2、在mouted裡面進行滾動監聽。
mounted(){
window.addEventListener('scroll',this.partScroll);
}
複製程式碼
3、最後記得在destroyed裡面進行銷燬。
destroyed () {
window.removeEventListener('scroll', this.partScroll)
}
複製程式碼
二、再聊佈局。
1、flex佈局模擬table表格。
這樣做的好處就是程式碼量小,position:fixed。應用到flex中,佈局不會亂。
2、table佈局。
實現方法:複製兩個完全一樣的table,需要固定定位的table外面包裹div,然後進行定位(table佈局進行固定定位佈局會亂)。 好處:不需要寫太多的樣式,壞處:程式碼量較大。
三、討論
各位有好的方法還可以關注個人微訊號(麥坤小子)共同探討。