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">
      <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()会不执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/745425.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20240626每日AI-----------创建你的第一个文心智能体平台Agent

载体 文心智能体平台Agent 注册 统一使用百度账户登录即可 创建智能体 登录后即可在左边菜单进行点击&#xff0c;创建智能体。 创建官方智能体 编写你的智能体名称等等信息

迅为RK3588开发板支持LVDS信号,标准 HDMI信号,IMIPI信号

性能强--iTOP-3588开发板采用瑞芯微RK3588处理器&#xff0c;是全新一代ALoT高端应用芯片&#xff0c;采用8nm LP制程&#xff0c;搭载八核64位CPU&#xff0c;四核Cortex-A76和四核Cortex-A55架构&#xff0c;主频高达2.4GHZ&#xff0c;8GB内存&#xff0c;32GB EMMC。 四核心…

【C++】关于虚函数的理解

深入探索C虚函数&#xff1a;原理、应用与实例分析 一、虚函数的原理二、虚函数的应用三、代码实例分析四、总结 在C面向对象编程的世界里&#xff0c;虚函数&#xff08;Virtual Function&#xff09;扮演着至关重要的角色。它不仅实现了多态性这一核心特性&#xff0c;还使得…

云层区分神经网络模型——二分类

云层区分神经网络模型——二分类 问奶奶&#xff0c;是什么让他们维护一份感情长达年&#xff0c;奶奶说那个年代什么东西坏了都会想要修&#xff0c;现在什么坏了都想着换。 安装依赖 # 要运行脚本&#xff0c;请先安装以下库&#xff1a;pip install tensorflowpip install …

健康管理系统

摘 要 随着现代社会生活节奏的加快和工作压力的增大&#xff0c;人们对健康管理的需求日益凸显。传统的健康管理方式&#xff0c;如定期体检、手动记录健康数据等&#xff0c;已经无法满足现代人对健康管理的即时性、全面性和个性化需求。因此&#xff0c;开发一款高效、便捷的…

Docker三分钟部署ElasticSearch平替MeiliSearch轻量级搜索引擎

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru (更多精彩内容可进入主页观看) &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 目录 一、 …

Topaz Gigapixel AI图片无损放大软件下载安装,Topaz Gigapixel AI 高精度的图片无损放大

Topaz Gigapixel AI无疑是一款革命性的图片无损放大软件&#xff0c;它在图像处理领域开创了一种全新的可能性。 Topaz Gigapixel AI的核心功能在于能够将图片进行高精度的无损放大。虽然经过软件处理的图片严格意义上并不能算是完全无损&#xff0c;但相较于传统方法&#xf…

一、什么是缓存穿透、缓存击穿、缓存雪崩

1、为啥使用缓存&#xff1f; 在程序内部使用缓存&#xff0c;将经常使用的数据存储在缓存中&#xff0c;可以减少对数据库的频繁访问&#xff0c;从而提高系统的响应速度和性能。缓存可以将数据保存在内存中&#xff0c;读取速度更快&#xff0c;能够大大缩短数据访问的时间&…

uniapp——上传图片获取到file对象而非临时地址——基础积累

最近在看uniapp的代码&#xff0c;遇到一个需求&#xff0c;就是要实现上传图片的功能 uniapp 官网地址&#xff1a;https://uniapp.dcloud.net.cn/ 上传图片有对应的API&#xff1a; uni.chooseImage方法&#xff1a;https://uniapp.dcloud.net.cn/api/media/image.html#choo…

【Python机器学习】分类向量——数字可以编码分类变量

在adult数据集的例子中&#xff0c;分类变量被编码为字符。一方面可能会有拼写错误&#xff0c;但另一方面&#xff0c;它明确的将一个变量标记为分类变量。无论是为了便于存储还是因为数据的手机方式&#xff0c;分类变量通常被编码为整数。 假设adult数据集中的人口普查数据…

windows系统根据端口查询pid并结束进程 netstat taskkill

用管理员权限打开命令指示符,输入命令&#xff1a; 1、查看被占用端口所对应的 PID netstat -aon|findstr “端口号” 2、查看指定PID的进程 tasklist|findstr ”14816” 3、结束进程 taskkill -pid 进程号 -f

秋招突击——6/24——复习{完全背包问题——买书,状态转换机——股票买卖V}——新作{两数相除,LRU缓存实现}

文章目录 引言复习完全背包问题——买书个人实现 状态转换机——股票买卖V个人实现参考实现 新作两数相除个人实现 新作LRU缓存实现个人实现unordered_map相关priority_queue相关 参考实现自己复现 总结 引言 今天知道拼多多挂掉了&#xff0c;难受&#xff0c;那实习就是颗粒无…

4_FOC之Clarke变换原理及推导_1

三相PMSM的数学模型是一个比较复杂且强耦合的多变量系统。为了便于后期控制器设计&#xff0c;必须选择合适的坐标变换对数学模型进行降阶和解耦变换。 1、什么是Clark变换 静止abc轴系与αβ轴系如上图。为满足功率不变约束&#xff0c;在图中设αβ轴系中定子绕组以及转子绕组…

# [0622] Task02 model-free 免模型类 RL 算法的预测和控制 【ε 贪心策略 优化的证明】

easy-rl PDF版本 笔记整理 P3 joyrl 比对 补充 P4 - P5 相关 代码 整理 ——> 有空 另开一页 最新版PDF下载 地址&#xff1a;https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用)&#xff1a; 链接: https://pan.baidu.com/s/1isqQnpVRWbb3yh8…

学好 prompt 让大模型变身撩富婆专家,带你走上人生巅峰

前文 使用大模型的最重要的一步就是编写好的提示词 prompt &#xff0c;但是 prompt 既容易被低估也容易被高估。被低估是因为设计良好的提示词可以显著提升效果。被高估是因为即使是基于提示的应用也需要大量的工程工作才能使其发挥作用。下面我会介绍在编写 prompt 的时候&a…

无芯封装基板适用于先进封装技术 我国行业发展面临一定挑战

无芯封装基板适用于先进封装技术 我国行业发展面临一定挑战 无芯封装基板指去除作为核心支撑层的芯板&#xff0c;仅由积层板构成的封装基板。与传统带有芯层的封装基板相比&#xff0c;无芯封装基板具有轻量化、密度高、信号传输质量高、散热性能好、布线灵活性好等优势&#…

靶机渗透之DC-7

一、信息收集 扫描网段&#xff0c;发现靶机ip为192.168.145.235。 nmap -sP 192.168.145.* 进一步对端口&#xff0c;靶机系统等信息进行一个收集。可以看到开放了22端口&#xff0c;80端口&#xff0c;主机系统为linux等信息。 nmap -sT -T4 -O -sV -sC -p1-65535 192.16…

品牌电商维权:应对渠道低价与假货的有力举措

在品牌治理渠道的过程中&#xff0c;会遭遇各种各样的问题&#xff0c;其中低价现象尤为突出。低价往往导致经销商被迫跟价&#xff0c;而未授权的店铺则更加不受管控&#xff0c;更容易出现低价情况。然而&#xff0c;低价本身不能直接作为品牌管控渠道的充分理由&#xff0c;…

元数据管理的发展历程你了解吗?元数据管理要克服哪些挑战?

在当今的信息化时代&#xff0c;数据的价值已被广泛认可&#xff0c;而元数据作为描述数据的数据&#xff0c;其作用日益凸显。元数据管理&#xff0c;作为确保数据质量、促进数据共享和提高数据透明度的关键环节&#xff0c;对企业的数据战略至关重要。随着技术的发展&#xf…

理解MySQL索引:提升查询性能的关键

一、前言 在众多数据库中&#xff0c;MySQL以其高效、稳定和跨平台的特点成为许多开发者的首选。然而&#xff0c;随着数据量的不断增加&#xff0c;查询性能可能会成为一个瓶颈。这时&#xff0c;索引&#xff08;Index&#xff09;便成为了提升查询速度的关键工具。本篇文章…