vue3使用vant4的列表vant-list点击进入详情自动滚动到对应位置,踩坑日记(一天半的踩坑经历)

news2024/11/18 5:51:24

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">
      <div
        class="search-box"
        :style="{ backgroundColor: state.backgroundColor }"
      >
        <div>
          <van-field
            v-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-list
        v-model:loading="state.loading"
        :finished="state.finished"
        finished-text="没有更多了"
        @load="onLoad"
        offset="100"
        :immediate-check="false"
      >
        <div
          class="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-switch
                v-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-popup
      v-model:show="state.showPop"
      position="bottom"
      round
      label="有效日期"
      custom-style="height: 50%;"
      @close="state.showPop = false"
    >
      <van-date-picker
        title="选择日期"
        :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.coloradmin.cn/o/1867756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[JS]DOM事件

事件监听 让程序检测是否有事件产生, 一旦事件触发, 就调用函数做出响应 事件三要素: 事件源(谁的事件) 事件类型(如何触发) 事件处理程序(做什么) function fn() {} // 绑定事件 btn.addEventListener(click, fnction() { })// 绑定事件 btn.addEventListener(click, fn)//…

Swoole v6 能否让 PHP 再次伟大?

大家好&#xff0c;我是码农先森。 现状 传统的 PHP-FPM 也是多进程模型的的运行方式&#xff0c;但每个进程只能处理完当前请求&#xff0c;才能接收下一个请求。而且对于 PHP 脚本来说&#xff0c;只是接收请求和响应请求&#xff0c;并不参与网络通信。对数据库资源的操作…

Arm Linux 修改 网络 mac 地址的方式方法

一、指令修改 查看网络信息指令 ifconfig修改网络 mac 地址&#xff0c;指令 ifconfig 网卡名 hw ether mac地址例如&#xff1a; ifconfig eth0 hw ether 08:00:27:00:01:96二、C语言程序修改 1.使用 ioctl 和 SIOCSIFHWADDR 来设置MAC地址&#xff0c;示例代码如下&…

【计算机毕业设计】087基于微信小程序社区养老服务

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

“ONLYOFFICE 8.1:提升用户体验和编辑功能的全面升级”

引言 官网链接 在当今快节奏的工作环境中&#xff0c;高效地处理文档是每个职场人士必备的技能。ONLYOFFICE 桌面编辑器凭借其强大的功能和用户友好的界面&#xff0c;成为了提升文档处理效率的得力助手。本文将介绍 ONLYOFFICE 桌面编辑器的核心特性&#xff0c;并展示如何通…

乐鑫已支持Matter 1.2标准新增多种设备类型,启明云端乐鑫代理商

随着物联网技术的飞速发展&#xff0c;智能家居正逐渐成为现代生活的一部分。物联网和智能家居行业应用取得了巨大的增长&#xff0c;一系列无线连接的智能设备涌入家庭&#xff0c;为家庭生活带来自动化和便利。 像是可以连网的扬声器、灯泡和中控开关&#xff0c;它们都可以…

AI Workflow的敏捷开发:持续创新与优化的艺术

在人工智能的浪潮中&#xff0c;AI Workflow作为大模型落地的关键实践&#xff0c;正逐渐成为技术领域的新宠。然而&#xff0c;随着技术的发展&#xff0c;我们面临着一系列挑战&#xff0c;如何有效地应对这些挑战&#xff0c;实现AI Workflow的敏捷开发&#xff0c;成为了一…

ROS学习记录:Hector_Mapping建图的参数设置

前言 launch文件启动Hector_Mapping的建图功能 在上一篇文章&#xff08;以上链接&#xff09;通过launch文件启动了Hector_Mapping建图功能&#xff0c;这一篇文章将在launch文件里给Hector_Mapping设置参数 一、Hector_Mapping有哪些参数 1、浏览器搜索并进入 ROS index 2…

使用CDN方式创建Vue3.0应用程序

CDN 的全称是 content delivery network&#xff0c;即内容分发网络。它是构建在现在的互联网基础之上的一层智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发和调度等功能模块&#xff0c;使用户就近获取所需内容&#xff0c…

Proxmox VE(PVE)上手配置指南

Proxmox VE&#xff08;PVE&#xff09;是一款开源虚拟化管理平台&#xff0c;集成了KVM和LXC技术&#xff0c;支持虚拟机和容器管理。它提供了一个基于Web的用户界面&#xff0c;支持高可用性集群、备份和恢复、实时迁移等功能&#xff0c;适用于企业级虚拟化环境。. 以下为安…

每日一道算法题 有效括号序列

题目 有效括号序列_牛客题霸_牛客网 (nowcoder.com) Python 1长度必须为偶数 2就像开心消消乐一样&#xff0c;一左一右就消掉。 class Solution:def isValid(self , s: str) -> bool:# write code here# flag[(),{},[]]# for _ in range(len(s)//2):# for i in fl…

AI+零信任 | 易安联亮相首届“矩阵杯”网络安全大赛

6月26日&#xff0c; 首届“矩阵杯”网络安全大赛 在青岛国际会议中心举行。大赛由360数字安全、华云安主办&#xff0c;赛宁网安、永信至诚、红客社区协办&#xff0c;致力于推动提升全民网络安全意识、发现顶尖安全人才、鼓励技术创新发展&#xff0c;推动安全行业共建共享…

可溶性聚四氟乙烯离子交换柱PFA层析柱微柱一体成型

PFA微柱&#xff0c;也叫PFA层析柱、PFA离子交换柱等&#xff0c;主要用于地质同位素超净化、痕量、超痕量、微量元素分析实验室。 规格参考&#xff1a;1.5ml、15ml、30ml等。 其主要特性有&#xff1a; 1、PFA层析柱&#xff08;微柱&#xff09;专为离子交换设计&#xff…

【Python特征工程系列】编码:非数值型数据(字符型)转化为数值型数据(案例+源码)

这是我的第310篇原创文章。 一、引言 前面我们使用的案例的数据无论是特征还是标签都是数值型数据&#xff0c;但是在平时工作中我们的数据往往含有非数值型特征&#xff08;object&#xff0c;比如文本字符类型的&#xff09;&#xff0c;这时候我们就需要对这类数据进行编码…

Redis 缓存一致性

Redis 业务结构 流程图 缓存一致性 Redis 和 MySQL 中数据保持一致 双检加锁策略 主要用于解决多线程环境下的并发问题&#xff0c;确保在高并发场景下对共享资源的访问是互斥的&#xff0c;避免因竞争条件导致的不一致状态 public User findUserById(Integer id) {User user …

金航标和萨科微公司发展历程

金航标kinghelm&#xff08;www.kinghelm.com.cn&#xff09;和萨科微slkor总经理宋仕强介绍公司发展发展历程时说&#xff0c;2015年萨科微与韩国延世大学团队当年萨科微碳化硅功率器件、SiC MOS、SiC SBD成功量产&#xff0c;2016年萨科微在中国大陆成功注册“Slkor”商标&am…

Build with Claude:价值 3 万美元 API 积分

只要在 6 月 26 日至 7 月 10 日创建一个基于 Anthropic API 的应用&#xff0c;并在这里提交&#xff0c;前三名可瓜分 3 万美元的 Anthropic 积分。

国企:中国电信天翼物联 2025届实习生招聘 二

5G解决方案工程师(南京实习生) 应聘资格要求 岗位职责 负责5G确定专网在工业、能源行业解决方案设计。 专业、能力要求 通信相关专业,有社团组织经验。 报名地址https://young.yingjiesheng.com/xyzlogin?ctmid=ac22e6c2-8b55-41ab-86c1-f530d5cb9218&ehirejobid=1558…

LeetCode 算法:验证二叉搜索树 c++

原题链接&#x1f517;&#xff1a;验证二叉搜索树 难度&#xff1a;中等⭐️⭐️ 题目 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于…

202486读书笔记|《格里格外》——活在当下,享受当下

202486读书笔记|《格里格外》——活在当下&#xff0c;享受当下 《格里格外》天然绘著&#xff0c;看的作者的上一本书是《生活蒙太奇》&#xff0c;生活里或遇见&#xff0c;或想象的画面&#xff0c;定格那一刻&#xff0c;让景色时间都有了更丰富的意义。 感动又欣喜&#…