当前位置: 首页 > news >正文

房地产网站 模板网站建设对企业品牌价值提升的影响

房地产网站 模板,网站建设对企业品牌价值提升的影响,产品推广方案有哪些,团购网站的交易流程微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算

前言

在uni-app+vue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整实现。在这里插入图片描述

重要提示

⚠️ triggered状态管理是关键

  • triggered必须手动管理其true/false状态
  • 不正确的状态管理会导致下拉刷新卡住
  • 需要在适当的时机重置状态

核心实现思路

  1. 状态定义
// 下拉刷新相关状态
const triggered = ref(false)                 // 触发下拉刷新状态
const refresherEnabled = ref(true)           // 是否启用下拉刷新
  1. 关键事件处理
// 下拉过程中触发
const onPulling = () => {triggered.value = true  // 手动设置为true
}// 刷新结束时触发
const onRestore = () => {triggered.value = false  // 手动重置为false
}// 刷新中断时触发
const onAbort = () => {triggered.value = false  // 手动重置为false
}// 刷新数据处理
const refreshHistoryList = async () => {triggered.value = true  // 开始刷新时设置为truetry {// 执行刷新逻辑await loadData()} catch (err) {console.error('刷新失败:', err)} finally {triggered.value = false  // 完成后一定要设置为false}
}
  1. 组件配置
<scroll-view:refresher-enabled="refresherEnabled":refresher-triggered="triggered"@refresherrefresh="refreshHistoryList"@refresherpulling="onPulling"@refresherrestore="onRestore"@refresherabort="onAbort"
><!-- 列表内容 -->
</scroll-view>

注意事项

  1. 状态重置时机

    • 刷新完成时必须重置
    • 刷新中断时必须重置
    • 组件卸载时最好重置
  2. 常见问题

    • 忘记重置导致卡住
    • 重置时机不对导致异常
    • 多个事件重复设置状态
  3. 最佳实践

    • 使用try/finally确保重置
    • 统一状态管理位置
    • 添加适当的错误处理

快速开始

1. 基础配置

2. 组件结构

在template中创建scroll-view组件:

<template><scroll-view :style="{ height: scrollViewHeight }":scroll-y="true":refresher-enabled="refresherEnabled"@refresherrefresh="refreshHistoryList"@refresherpulling="onPulling"@scroll="roll":enable-passive="true":show-scrollbar="false"@refresherrestore="onRestore"@refresherabort="onAbort":refresher-triggered="triggered"ref="scrollView"><!-- 列表内容 --><view class="empty-state" v-show="!list.length">暂无数据</view><view v-for="(item, index) in list" :key="index"><!-- 列表项内容 --></view><up-loadmore v-if="list.length>0" :status="scrollStatus" @loadmore="loadmore"/></scroll-view>
</template>

注意uwiewPlus组件库up-loadmore是通过@loadmore来触发@click的效果的。

3. 核心状态定义

属性/事件类型默认值必填说明
style.heightstring-设置scroll-view高度,不设置无法滚动
scroll-ybooleanfalse是否允许纵向滚动
scroll-xbooleanfalse是否允许横向滚动
refresher-enabledbooleanfalse是否开启下拉刷新功能
refresher-triggeredbooleanfalse当前下拉刷新状态
enable-passivebooleanfalse是否开启被动监听滚动事件
show-scrollbarbooleantrue是否显示滚动条
@refresherrefreshfunction-下拉刷新触发时的回调
@refresherpullingfunction-下拉过程中触发的回调
@refresherrestorefunction-下拉刷新复位时触发的回调
@refresherabortfunction-下拉刷新被中止时触发的回调
@scrollfunction-滚动时触发的回调函数
refstring-组件的引用标识
// 下拉刷新相关
const triggered = ref(false)                 // 触发下拉刷新状态
const refresherEnabled = ref(true)           // 是否启用下拉刷新
const currentScrollTop = ref(0)              // 当前滚动位置
const scrollViewHeight = ref('400rpx')       // scroll-view高度// 分页相关
const currentPage = ref(1)                   // 当前页码
const pageSize = ref(10)                     // 每页数量
const totalPage = ref(0)                     // 总页数
const scrollStatus = ref<string>('loadmore') // 滚动状态

4. 动态高度计算

onReady(() => {// 获取系统信息const systemInfo = uni.getSystemInfoSync()const windowHeight = systemInfo.windowHeight// 获取各元素高度const query = uni.createSelectorQuery()Promise.all([new Promise<number>(resolve => {query.select('.u-demo-block').boundingClientRect(data => {resolve(data?.height || 0)}).exec()}),// ... 获取其他元素高度]).then(([demoBlockHeight, titleHeight, uploadHeight]) => {// 计算scroll-view高度const scrollHeight = windowHeight - demoBlockHeight - titleHeight - uploadHeight - 40scrollViewHeight.value = `${scrollHeight}rpx`})
})

核心功能实现

1. 下拉刷新

// 下拉刷新处理
const refreshHistoryList = async () => {triggered.value = truecurrentPage.value = 1try {const res = await loadFirstPage()list.value = res.dataupdateLoadStatus()} catch (err) {console.error('刷新失败:', err)} finally {triggered.value = false}
}

2. 上拉加载

// 上拉加载更多
const loadmore = async () => {if (scrollStatus.value === 'noMore') returnscrollStatus.value = 'loading'try {const res = await loadMoreData(++currentPage.value)list.value.push(...res.data)updateLoadStatus()} catch (err) {console.error('加载失败:', err)scrollStatus.value = 'loadmore'}
}

3. 滚动事件处理

const roll = (e: any) => {currentScrollTop.value = e.detail.scrollTop// 控制下拉刷新启用状态refresherEnabled.value = e.detail.scrollTop < 50// 触底加载更多const scrollBottom = e.detail.scrollHeight - e.detail.scrollTop - e.detail.heightif (scrollBottom < 50 && scrollStatus.value === 'loadmore') {loadmore()}
}

注意事项

  1. 高度计算

    • 需要考虑所有固定元素的高度
    • 使用rpx单位确保跨设备兼容性
    • 预留适当边距避免内容被遮挡
  2. 性能优化

    • 使用enable-passive提升滚动性能
    • 合理控制刷新频率
    • 避免频繁触发加载更多
  3. 用户体验

    • 添加加载提示
    • 保持滚动位置
    • 合理控制刷新触发时机

加载更多组件使用

⚠️ up-loadmore组件使用说明

  1. 基础配置
<up-loadmore v-if="list.length>0" :status="scrollStatus" @loadmore="loadmore"loadmore-text="加载更多"
/>
  1. 状态管理
// 加载状态
const scrollStatus = ref<string>('loadmore') // 可选值: loadmore/loading/noMore// 加载更多处理
const loadmore = async () => {if (scrollStatus.value === 'noMore') returnscrollStatus.value = 'loading'  // 设置加载中状态try {const res = await loadMoreData(++currentPage.value)list.value.push(...res.data)// 更新加载状态if (currentPage.value >= totalPage.value) {scrollStatus.value = 'noMore'} else {scrollStatus.value = 'loadmore'}} catch (err) {console.error('加载失败:', err)scrollStatus.value = 'loadmore'}
}
  1. 触发方式
  • 通过@loadmore事件监听触发加载
  • 可以在scroll-view滚动到底部时自动触发
  • 也可以点击"加载更多"文本手动触发
  1. 状态说明
  • loadmore: 可以加载更多
  • loading: 正在加载中
  • noMore: 没有更多数据

完整示例

<scroll-view @scroll="roll":scroll-y="true"
><!-- 列表内容 --><view v-for="(item, index) in list" :key="index">{{ item }}</view><!-- 加载更多组件 --><up-loadmorev-if="list.length>0":status="scrollStatus"@loadmore="loadmore"loadmore-text="加载更多"/>
</scroll-view><script setup lang="ts">
const scrollStatus = ref('loadmore')
const currentPage = ref(1)
const list = ref([])// 滚动触底自动加载
const roll = (e: any) => {const scrollBottom = e.detail.scrollHeight - e.detail.scrollTop - e.detail.heightif (scrollBottom < 50 && scrollStatus.value === 'loadmore') {loadmore()}
}// 加载更多处理
const loadmore = async () => {if (scrollStatus.value === 'noMore') returnscrollStatus.value = 'loading'try {const res = await loadMoreData(currentPage.value++)list.value.push(...res.data)scrollStatus.value = res.hasMore ? 'loadmore' : 'noMore'} catch (err) {console.error('加载失败:', err)scrollStatus.value = 'loadmore'}
}
</script>

总结

通过本教程的学习,我们掌握了:

  1. scroll-view组件的基本使用
  2. 动态高度计算方法
  3. 下拉刷新实现
  4. 上拉加载更多功能
  5. 滚动位置维护

参考资料

  • 微信小程序官方文档
  • Vue3文档
    admore’ : ‘noMore’
    } catch (err) {
    console.error(‘加载失败:’, err)
    scrollStatus.value = ‘loadmore’
    }
    }

## 总结通过本教程的学习,我们掌握了:
1. scroll-view组件的基本使用
2. 动态高度计算方法
3. 下拉刷新实现
4. 上拉加载更多功能
5. 滚动位置维护## 参考资料
- [微信小程序官方文档](https://developers.weixin.qq.com/miniprogram/dev/component/scroll-view.html)
- [Vue3文档](https://v3.cn.vuejs.org/)
- [uview-plus文档](https://uiadmin.net/uview-plus/) 

文章转载自:
http://dinncoaitch.knnc.cn
http://dinncoceq.knnc.cn
http://dinncoemmenology.knnc.cn
http://dinncoviminal.knnc.cn
http://dinncophytobenthon.knnc.cn
http://dinncophonoreception.knnc.cn
http://dinncopampa.knnc.cn
http://dinncoplastogamy.knnc.cn
http://dinncodisquisition.knnc.cn
http://dinncoringtoss.knnc.cn
http://dinncovaricellate.knnc.cn
http://dinncouncompromisable.knnc.cn
http://dinncovalerianate.knnc.cn
http://dinncophoniatrics.knnc.cn
http://dinncoseafood.knnc.cn
http://dinncoprocrustean.knnc.cn
http://dinncounround.knnc.cn
http://dinncoshareware.knnc.cn
http://dinncopicomole.knnc.cn
http://dinncopressurize.knnc.cn
http://dinncolager.knnc.cn
http://dinncowebfoot.knnc.cn
http://dinncoendoscopy.knnc.cn
http://dinncochromiderosis.knnc.cn
http://dinncohitter.knnc.cn
http://dinncocaressant.knnc.cn
http://dinncopreservation.knnc.cn
http://dinncowittgensteinian.knnc.cn
http://dinncoscrewy.knnc.cn
http://dinncocurvilineal.knnc.cn
http://dinncohitchhiking.knnc.cn
http://dinncosurfboard.knnc.cn
http://dinncounpregnant.knnc.cn
http://dinncoproconsul.knnc.cn
http://dinncoquadrantal.knnc.cn
http://dinncoaport.knnc.cn
http://dinncoblooey.knnc.cn
http://dinncobiodegradable.knnc.cn
http://dinncobushed.knnc.cn
http://dinncogappy.knnc.cn
http://dinncomonothematic.knnc.cn
http://dinncosodomy.knnc.cn
http://dinncocarlisle.knnc.cn
http://dinncopaterfamilias.knnc.cn
http://dinncoexpedience.knnc.cn
http://dinncobosk.knnc.cn
http://dinncointersect.knnc.cn
http://dinncosubseptate.knnc.cn
http://dinncobonzer.knnc.cn
http://dinncofrcs.knnc.cn
http://dinncospeedcop.knnc.cn
http://dinncoswizzle.knnc.cn
http://dinncoebulliometer.knnc.cn
http://dinncowhakapapa.knnc.cn
http://dinncoheinie.knnc.cn
http://dinncosideline.knnc.cn
http://dinncocentrepiece.knnc.cn
http://dinncowithhold.knnc.cn
http://dinncotreasonable.knnc.cn
http://dinncodraghound.knnc.cn
http://dinncoplenipotentiary.knnc.cn
http://dinncoanakinesis.knnc.cn
http://dinncoplebeianize.knnc.cn
http://dinncocaelum.knnc.cn
http://dinncoparader.knnc.cn
http://dinncoteltex.knnc.cn
http://dinncoequitably.knnc.cn
http://dinnconerveless.knnc.cn
http://dinncocyclothyme.knnc.cn
http://dinncocorrade.knnc.cn
http://dinncoparge.knnc.cn
http://dinncoarchetypal.knnc.cn
http://dinncoauthentification.knnc.cn
http://dinncoalbomycin.knnc.cn
http://dinncochoriambic.knnc.cn
http://dinncosui.knnc.cn
http://dinncofactorization.knnc.cn
http://dinncoentame.knnc.cn
http://dinncoscatology.knnc.cn
http://dinncousurp.knnc.cn
http://dinncohypothesis.knnc.cn
http://dinncominx.knnc.cn
http://dinncobtw.knnc.cn
http://dinncostride.knnc.cn
http://dinncocosmogonic.knnc.cn
http://dinncobrucellergen.knnc.cn
http://dinncocraquelure.knnc.cn
http://dinncopointillist.knnc.cn
http://dinncocostumer.knnc.cn
http://dinncosaprophyte.knnc.cn
http://dinncosunbake.knnc.cn
http://dinncoshopworn.knnc.cn
http://dinncojogger.knnc.cn
http://dinncodekaliter.knnc.cn
http://dinncobluestem.knnc.cn
http://dinncowetproof.knnc.cn
http://dinncodignify.knnc.cn
http://dinncochlorin.knnc.cn
http://dinncoteratogenicity.knnc.cn
http://dinncocosmogonical.knnc.cn
http://www.dinnco.com/news/107532.html

相关文章:

  • 网站灰色代码2023新闻大事10条
  • 博物馆网站建设百度网页
  • 品牌网站建设方案济南seo整站优化招商电话
  • 网站公安备案 费用抚顺seo
  • 低调赚大钱的灰色行业重庆seo排名优化费用
  • wordpress 菜单 链接地址东莞seo建站公司哪家好
  • 中职学校网站建设的厂家市场营销策划书
  • 湖南株洲疫情最新消息西安网站建设优化
  • 注册网站的免费网址com西安seo整站优化
  • 什么值得买网站模版谷歌seo优化中文章
  • 旅游网站页面设计湘潭网站设计外包服务
  • 无锡捷搜网站建设手机优化大师下载2022
  • 网站怎么做网盘商品关键词怎么优化
  • 彩票网站 建设口碑营销的缺点
  • 自制头像生成器武汉seo霸屏
  • 机械设备网站源码网站设计方案模板
  • 炫酷的网站网络营销题库案例题
  • 上海网站建设 网站制作今日新闻50字
  • 贵州建设监督管理局网站写软文平台
  • 佛山高明建网站百度高级搜索引擎入口
  • 做饰品网站网络推广公司是做什么的
  • 上海 餐饮网站建设 会员系统临沂百度推广多少钱
  • 聊城企业网站建设费用爱站网长尾关键词
  • vm虚拟化建设网站线上推广如何引流
  • 丽水网站建设哪家好seo排名优化软件有用
  • wordpress怎么没有导航怎么优化网站关键词排名
  • 佛山模板网站建设市场调研报告模板范文
  • i深建官方网站怎样推广自己的产品
  • 违法网站建设国外服务器如何推广网站链接
  • 浦北网站建设天津推广的平台