vue3使用vant4的列表vant-list點擊進入詳情自動滾動到對應位置,踩坑日記(一天半的踩坑經歷)

1.路由添加keepAlive

 <!-- Vue3緩存組件,寫法和Vue2不一樣--><router-view v-slot="{ Component }"><keep-alive><component :is="Component" v-if="$route.meta.keepAlive"/></keep-alive><component :is="Component" v-if="!$route.meta.keepAlive"/></router-view>

2.路由添加mate標識

 {path: "/user-manage", // 用戶管理name: "user-manage",meta: {keepAlive: true, //此頁面需要緩存isBack: false,scrollTop:0},component: () => import("../pages/user/index.vue"),},

3.在beforeRouteEnter里面給如果從詳情頁面返回meta.isBack改變值為true ps(beforeRouteEnter這個生命周期函數里滑動不生效需要在onActivated里面執行),(因為vu3 setup里面沒有beforeRouteEnter)需要單獨引入一個script,在onActivated生命周期函數里讓頁面滑動到指定位置(全部代碼)

<template><div class="area-setting-list" ref="wrapper"><!-- 導航欄 --><TopMenu:titleText="state.menuText":backgroundColor="state.bgColor":pathName="state.pathName"></TopMenu><!-- 搜索框 --><van-sticky offset-top="44"><divclass="search-box":style="{ backgroundColor: state.backgroundColor }"><div><van-fieldv-model="state.queryType.keyword"left-icon="search"placeholder="請輸入郵箱/手機號"@blur="init"@click-input="updataChange"/></div><div @click="state.show = true"></div></div></van-sticky><div class="device-list"><van-listv-model:loading="state.loading":finished="state.finished"finished-text="沒有更多了"@load="onLoad"offset="100":immediate-check="false"><divclass="device-item"v-for="(item, index) in state.list":key="index"@click="goUserDetail(item)"><div class="first-item"><div><div class="first-item_light">{{ item.userIdentity?.value + index }}</div><div>賬號: {{ item.account }}</div></div><div><van-switchv-model="item.checked"size="20px":loading="item.switchLoading"@click.stop="switchChange(item)"/></div></div><div class="second-item"><div>創建時間 : {{ item.createTime }}</div><div>{{ item.enableStatus?.value }}</div></div></div></van-list></div><div class="addBtn" @click="addUser">添加用戶</div><!-- 篩選彈框 --><van-action-sheet v-model:show="state.show" title="篩選"><div class="pop-content"><div class="title">賬戶類型</div><div class="select-ite"><div class="active">電站業主<div class="select-bage"></div></div><div>經銷商<div class="select-bage"></div></div><div>服務商<div class="select-bage"></div></div><div>安裝商<div class="select-bage"></div></div></div><div class="title">創建時間</div><div class="select-time"><div @click="selectStartTime">{{state.queryType.startTime == ""? "開始時間": state.queryType.startTime}}</div><div>~</div><div @click="selectEndTime">{{state.queryType.endTime == ""? "結束時間": state.queryType.endTime}}</div></div><div class="select-btn"><div @click="restQuery">重置</div><div @click="getMoreQuery">確定</div></div></div></van-action-sheet><!-- 日期選擇器 --><van-popupv-model:show="state.showPop"position="bottom"roundlabel="有效日期"custom-style="height: 50%;"@close="state.showPop = false"><van-date-pickertitle="選擇日期":min-date="minDate":max-date="maxDate"@cancel="state.showPop = false"@confirm="selectTime"/></van-popup></div>
</template>
<script>
import { defineComponent } from "vue";export default defineComponent({beforeRouteEnter(to, from, next) {if (from.name === "edit-user") {to.meta.isBack = true;window.scrollTo({top: 300,behavior: "smooth", // 平滑滾動});console.log("beforeRouteEnter");console.log(from.meta);console.log(store.state.listHeight);console.log("beforeRouteEnter");} // 放行路由next();},
});
</script>
<script setup>
import daohang from "../../assets/daohang.png";
import {getCurrentInstance,onMounted,reactive,inject,ref,onActivated,onUnmounted,nextTick,watch,
} from "vue";
import TopMenu from "../../component/topMenu.vue";
import { useRouter, useRoute, onBeforeRouteLeave } from "vue-router";
import store from "@/store/index";const { proxy } = getCurrentInstance();
const router = useRouter();
const route = useRoute();
const wrapper = ref(null);const state = reactive({menuText: "用戶管理",pathName: "",bgColor: "transparent",activeColor: "#EA5514",backgroundColor: "#F9EBE5",loading: false,finished: false,list: [],pageNum: 1,backgroundColor: "transparent",checked: true,show: false,showPop: false,queryType: {endTime: "",keyword: "",startTime: "",},pageType: {pageIndex: 1,pageSize: 10,},currentScrollTop: 0,timeType: 0,
});
watch(() => state.queryType.keyword, // 要監聽的響應式屬性(newValue, oldValue) => {// 當屬性值變化時,這個回調函數會被調用console.log(newValue);if (newValue == "") {init();}}
);
// 列表觸底加載
const onLoad = () => {console.log("觸底了");state.loading = false;state.pageType.pageIndex++;getList();
};// 監聽頁面滾動的方法
const doScroll = (event) => {console.log(window.scrollY);state.currentScrollTop = window.scrollY;if (window.scrollY > 20) {state.bgColor = "#D6E6F9";state.backgroundColor = "#D6E6F9";} else {state.bgColor = "transparent";state.backgroundColor = "transparent";}
};// 數據初始化
const init = () => {state.list = [];state.finished = false;state.pageType.pageIndex = 1;getList();
};
// 查詢
const searchList = () => {state.pageType.pageIndex = 1;state.finished = false;state.list = [];getList();
};
const updataChange = (value) => {console.log(value);
};
// 查詢用戶列表
const getList = () => {state.loading = true;proxy.$H.post(proxy, proxy.$A.user.list, {data: state.queryType,page: state.pageType,}).then((res) => {let lists = res.data.data;state.loading = false;if (lists.length > 0) {for (let item of lists) {if (item.enableStatus.key == "ENABLE") {item.checked = true;} else {item.checked = false;}item.switchLoading = false;}}if (lists.length < 10) {state.finished = true;}state.list = state.list.concat(lists);console.log("ccccc");console.log(state.list);console.log("ccccc");});
};
// 啟用禁用用戶
const switchChange = (item) => {console.log(item);item.switchLoading = true;proxy.$H.post(proxy, proxy.$A.user.updateEnableStatus, {data: {key: item.id,value: item.checked ? "DISABLE" : "ENABLE",},}).then((res) => {item.switchLoading = false;init();}).catch((err) => {item.switchLoading = false;});
};
// 新增用戶
const addUser = () => {console.log("點了新增用戶");router.push("/add-user");
};// 用戶詳情
const goUserDetail = (item) => {// store.commit("setDetailFlag", true);console.log("點擊了詳情");store.commit("setListHeight", state.currentScrollTop);router.push({path:'/edit-user',query:{id:item.id}})};// 選擇開始時間
const selectStartTime = () => {state.showPop = true;state.timeType = 0;
};// 選擇結束時間
const selectEndTime = () => {state.showPop = true;state.timeType = 1;
};
// 時間picker觸發的事件
const selectTime = (value) => {let time =value.selectedValues[0] +"-" +value.selectedValues[1] +"-" +value.selectedValues[2];console.log(time);if (state.timeType == 0) {state.queryType.startTime = time;} else {state.queryType.endTime = time;}state.showPop = false;
};
// 更多篩選點擊確定
const getMoreQuery = () => {if (state.queryType.startTime != "") {if (state.queryType.endTime == "") {proxy.$U.errMsg("請選擇結束時間");return;}}state.show = false;init();
};
// 重置查詢條件
const restQuery = () => {state.queryType = {endTime: "",keyword: "",startTime: "",};
};
onMounted(() => {// 當天日期console.log("onMounted");// 監聽頁面滾動window.addEventListener("scroll", doScroll, true);
});
onUnmounted(() => {window.removeEventListener("scroll", doScroll);
});
onActivated(() => {console.log("onActivated");console.log(route.meta.isBack);console.log("onActivated");if (!route.meta.isBack) {// 不是從詳情頁面進來的就重新加載數據init();route.meta.isBack = false;}window.scrollTo({top: store.state.listHeight,behavior: "smooth", // 平滑滾動});
});
</script><style lang="less" scoped>
@import "./index.less";
.dialog-content {max-height: 60vh;overflow-y: scroll;border: 1px solid red;padding: 20px;.dia-cent {margin-bottom: 3px;}
}
</style>

在這里插入圖片描述
注意點!!!!!!!
在這里插入圖片描述
否則window.scrollTo()會不執行

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37317.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37317.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37317.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在MySQL中按字符串中的數字排序

在管理數據庫時&#xff0c;我們經常遇到需要按嵌入在字符串中的數字進行排序的情況。這在實際應用中尤為常見&#xff0c;比如文件名、代碼版本號等字段中通常包含數字&#xff0c;而這些數字往往是排序的關鍵。本文將詳細介紹如何在MySQL中利用正則表達式提取字符串中的數字并…

LiteDB - 一個單數據文件 .NET NoSQL 文檔存儲

LiteDB 一個小巧、快速、輕量級的 NoSQL 嵌入式數據庫。 Serverless NoSQL 文檔存儲類似于 MongoDB 的簡單 API100% C# 代碼,支持 .NET 3.5 / .NET 4.0 / NETStandard 1.3 / NETStandard 2.0,單 DLL (小于 300 kb)支持線程和進程安全支持文檔/操作級別的 ACID支持寫失敗后的數…

Google 發布最新開放大語言模型 Gemma 2,現已登陸 Hugging Face Hub

Google 發布了最新的開放大語言模型 Gemma 2&#xff0c;我們非常高興與 Google 合作&#xff0c;確保其在 Hugging Face 生態系統中的最佳集成。你可以在 Hub 上找到 4 個開源模型 (2 個基礎模型和 2 個微調模型) 。發布的功能和集成包括&#xff1a; Hub 上的模型https://hf.…

Java家教系統小程序APP公眾號h5源碼

讓學習更高效&#xff0c;更便捷 &#x1f31f; 引言&#xff1a;家教新選擇&#xff0c;小程序來助力 在快節奏的現代生活中&#xff0c;家長們越來越注重孩子的教育問題。然而&#xff0c;如何為孩子找到一位合適的家教老師&#xff0c;成為了許多家長頭疼的問題。現在&…

交叉編譯中的 --build、 --host和 --target

在交叉編譯中比較常見的一些參數就是build、host和target了,正確的理解這三者的含義對于交叉編譯是非常重要的,下面就此進行解釋   --build=編譯該軟件所使用的平臺   --host=該軟件將運行在哪個平臺   --target=該軟件所處理的目標平臺 我們經常會看到如下代碼:   …

谷歌個人號,20人連續封測14天所需設備該怎么解決?

現在&#xff0c;在Google Play上架應用&#xff0c;對于大部分開發者來說&#xff0c;真的是不小的挑戰&#xff0c;因為目前谷歌上架政策越來越嚴格了。特別是從2023年11月13日起&#xff0c;新政策要求個人開發者賬號的應用必須經過20個獨立用戶連續14天的封閉測試&#xff…

【C語言】--分支和循環(1)

&#x1f37f;個人主頁: 起名字真南 &#x1f9c7;個人專欄:【數據結構初階】 【C語言】 目錄 前言1 if 語句1.1 if1.2 else1.3 嵌套if1.4 懸空else 前言 C語言是結構化的程序設計語言&#xff0c;這里的結構指的是順序結構、選擇結構、循環結構。 我們可以用if、switch實現分支…

vue2實例實現一個初步的vuex

vue2實例實現一個初步的vuex 實現源碼&#xff1a;vue2-review 1.App.vue 2.store目錄下的index.js 3.效果 微信公眾號&#xff1a;刺頭拾年

MATLAB的.m文件與Python的.py文件:比較與互參

simulink MATLAB的.m文件與Python的.py文件&#xff1a;比較與互參相似之處**1. 基本結構****2. 執行邏輯****3. 可讀性和維護性** 差異性**1. 語法特性****2. 性能和應用****3. 開發環境** 互相學習的可能性結論 MATLAB的.m文件與Python的.py文件&#xff1a;比較與互參 在編…

擴展閱讀:什么是中斷

如果用一句話概括操作系統的原理,那就是:整個操作系統就是一個中斷驅動的死循環,用最簡單的代碼解釋如下: while(true){doNothing(); } 其他所有事情都是由操作系統提前注冊的中斷機制和其對應的中斷處理函數完成的。我們點擊一下鼠標,敲擊一下鍵盤,執行一個程序,…

重生之我要學后端100--計算機網絡部分概念(持續更新)

TCP/IP、DNS、負載均衡器等等 前言一、TCP/IP&#xff08;傳輸控制協議/互聯網協議&#xff09;二、DNS&#xff08;域名系統&#xff09;三、負載均衡器其他網絡概念 前言 了解網絡基礎知識對于后端開發者至關重要&#xff0c;因為這些知識有助于理解應用程序是如何在更廣闊的…

中英雙語介紹美國的州:麻省,馬塞諸塞州(Massachusetts)

中文版 馬薩諸塞州&#xff08;Massachusetts&#xff09;位于美國東北部的新英格蘭地區&#xff0c;是美國歷史最悠久、文化最豐富的州之一。以下是對馬薩諸塞州各方面的詳細介紹&#xff1a; 人口 截至2020年&#xff0c;美國人口普查數據顯示&#xff0c;馬薩諸塞州的人口…

C++ 之運算符

作用&#xff1a;用于執行代碼的運算 主要的運算符類型&#xff1a; 運算符類型作用算術運算符用于處理四則運算賦值運算符用于將表達式的值賦給變量比較運算符用于表達式的比較&#xff0c;并返回一個真值或假植邏輯運算符用于根據表達式的值返回真值或假植 1 算術運算符 …

Spring MVC中的DispatcherServlet、HandlerMapping和ViewResolver的作用

在Spring MVC框架中&#xff0c;DispatcherServlet、HandlerMapping和ViewResolver是核心組件&#xff0c;它們各自承擔著不同的角色和任務&#xff1a; 1.DispatcherServlet&#xff1a;它是Spring MVC生命周期中的前端控制器&#xff0c;負責接收HTTP請求并將它們分發給相應的…

5.x86游戲實戰-CE定位基地址

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 上一個內容&#xff1a;4.x86游戲實戰-人物狀態標志位 上一個內容通過CE未知的初始值、未變動的數值、…

機器學習SVR 隨機森林 RBF神經網絡做回歸預測的MATLAB代碼

SVR 參考這篇文章 Libsvm使用筆記【matlab】 close all; clc clear %% 下載數據 load(p_train.mat); load(p_test.mat); load(t_train.mat); load(t_test.mat); %% 數據歸一化 %輸入樣本歸一化 [pn_train,ps1] mapminmax(p_train); pn_train pn_train; pn_test mapminma…

設置用戶訪問hdfs

如果hadoop沒有啟Kerberos或者從Kerberos獲取的用戶為null&#xff0c;那么獲取HADOOP_USER_NAME環境變量&#xff0c;并將它的值作為Hadoop執行用戶。如果我們沒有設置HADOOP_USER_NAME環境變量&#xff0c;那么程序將調用whoami來獲取當前用戶&#xff0c;并用groups來獲取用…

JVM相關總結

JVM的些許問題 1.JVM內存區域劃分 2.JVM類加載過程 3.JVM的垃圾回收機制 1.JVM的內存區域劃分 一個運行起來的Java進程就是一個JVM虛擬機,需要從操作系統申請一大片內存,就會把內存劃分成幾個區域,每個區域都有不同的作用 常見的面試題 2.JVM類加載過程 熟練背誦 ! ! !…

printf內幕----編程內幕(1)

曾幾何時&#xff0c;您有沒有在夜深人靜的時候想過一個問題&#xff0c;printf內部究竟做了什么&#xff1f;為何可以輸出到屏幕上顯示出來&#xff1f; 先看看這段熟悉的代碼&#xff1a; // // Created by xi.chen on 2017/9/2. // Copyright © 2017 All rights rese…

WordPress中文網址導航欄主題風格模版HaoWa

模板介紹 WordPress響應式網站中文網址導航欄主題風格模版HaoWa1.3.1源碼 HaoWA主題風格除行為主體導航欄目錄外&#xff0c;對主題風格需要的小控制模塊都開展了敞開式的HTML在線編輯器方式的作用配備&#xff0c;另外預埋出默認設置的編碼構造&#xff0c;便捷大伙兒在目前…