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

企业门户网站是什么意思搜狗推广做网站要钱吗

企业门户网站是什么意思,搜狗推广做网站要钱吗,怎么购买国外服务器,网站用什么做备份一、背景 在我们开发项目中,经常会遇到需要展示大量选项的多选框场景,比如权限配置、数据筛选等。当选项数量达到几百甚至上千条时,传统的渲染方式全选时会非常卡顿,导致性能问题。本篇文章,记录我使用通过虚拟滚动实现…

一、背景

在我们开发项目中,经常会遇到需要展示大量选项的多选框场景,比如权限配置、数据筛选等。当选项数量达到几百甚至上千条时,传统的渲染方式全选时会非常卡顿,导致性能问题。本篇文章,记录我使用通过虚拟滚动实现大数据量全选卡顿问题~封装成组件啦可以直接用!

二、效果图

在这里插入图片描述

三、功能特点

  • 虚拟滚动:只渲染可视区域的选项,大幅提升性能
  • 搜索过滤:支持选项实时搜索
  • 全选/反选:一键操作所有选项
  • 默认选中:支持初始化选中项
  • 性能优化:使用节流和防抖处理滚动和搜索

四、组件virtual-checkbox.vue完整代码

<template><div class="virtual-checkbox"><el-input v-if="showSearch"v-model="keyword" prefix-icon="el-input__icon el-icon-search" type="text" placeholder="搜索" @input="seachKey"></el-input><el-checkbox v-model="checkAll" :style="`height:${itemH}px`" class="check-all-box" :indeterminate="isIndeterminate" @change="handleCheckAllChange">全选</el-checkbox><div ref="scrollBox" :style="`width:${viewW}px;height:${viewH}px;line-height:${itemH}px;overflow-y:auto`" @scroll="handleScroll"><div :style="`height:${scrollH}px;min-height:${viewH - 22}px`" class="list"><el-checkbox-group v-if="searchOptions.length" v-model="checkedList" :style="`transform:translateY(${offsetY}px)`" @change="handleCheckChange"><el-checkbox v-for="item in viewOptions" :key="item.value" :label="item.value" :style="`height:${itemH}px`" @change="handleCheckChange">{{ item.label }}</el-checkbox></el-checkbox-group><div v-else class="empty-text" :style="`height:${viewH - 22}px`">暂无数据</div></div></div></div>
</template><script>
import { throttle, debounce } from 'lodash'
/*** @component VirtualCheckbox* @description 虚拟滚动多选框组件,用于处理大数据量的选项列表。* 实现了以下功能:* 1. 虚拟滚动:只渲染可视区域的选项,优化性能* 2. 搜索过滤:支持选项搜索* 3. 全选/反选:支持一键全选/反选* 4. 默认选中:支持默认值回显*/
export default {props: {// 所有选项数据数组,格式:[{label: '选项名', value: '选项值'}]options: {type: Array,default: function () { return [] }},// 默认选中项的值数组defaultChecked: {type: Array,default: function () { return [] }},// 虚拟列表可视区域高度(像素)viewH: {type: Number,default: function () { return 200 }},// 虚拟列表可视区域宽度(像素)viewW: {type: Number,default: function () { return 300 }},// 每个选项的高度(像素)itemH: {type: Number,default: function () { return 20 }},// 是否显示搜索框showSearch: {type: Boolean,default: true}},data() {return {checkAll: false,isIndeterminate: false,searchOptions: [], // 搜索后的数据checkedList: [], // 当前选中的数据viewOptions: [], // 显示区域的数据keyword: '', // 搜索关键字offsetY: 0 // 偏移量}},computed: {scrollH() {return this.searchOptions.length * this.itemH},// 计算可视区域需要显示的选项数量visibleCount() {return Math.floor(this.viewH / this.itemH) + 1},// 计算当前显示区域的起始索引startIndex() {return Math.floor(this.offsetY / this.itemH)}},watch: {// 监听默认勾选变化 渲染勾选defaultChecked: {handler(val) {this.checkedList = valthis.handleCheckAllIndeterminate()},deep: true,immediate: true}},beforeDestroy() {// 清理防抖和节流函数if (this.throttledScroll) {this.throttledScroll.cancel()}if (this.debouncedSearch) {this.debouncedSearch.cancel()}},created() {this.initData()// 创建节流函数this.throttledScroll = throttle(this.handleScrollContent, 10)// 创建防抖函数this.debouncedSearch = debounce(this.handleSearch, 300)},methods: {/*** 处理单个选项的选中状态变化* @emits change - 触发选中数据变化事件*/handleCheckChange() {this.handleCheckAllIndeterminate()this.$emit('change', this.getCheckedData())},/*** 处理全选/取消全选* @param {Boolean} val - 是否全选* @emits change - 触发选中数据变化事件*/handleCheckAllChange(val) {this.checkedList = val ? this.options.map(item => item.value) : []this.isIndeterminate = falsethis.$emit('change', this.getCheckedData())},// 处理全选是否选中或者半选handleCheckAllIndeterminate() {this.checkAll = this.checkedList.length === this.options.lengththis.isIndeterminate = this.checkedList.length > 0 && this.checkedList.length < this.options.length},// 滚动事件handleScroll(e) {this.throttledScroll(e)},handleScrollContent(e) {let scrollTop = e.target.scrollTopthis.offsetY = scrollTop - scrollTop % this.itemHthis.viewOptions = this.searchOptions.slice(this.startIndex,this.startIndex + this.visibleCount)},// 搜索seachKey() {this.debouncedSearch()},// 搜索具体实现/*** 搜索过滤* @description 支持对选项label的模糊搜索,大小写不敏感*/handleSearch() {if (this.keyword) {this.searchOptions = this.options.filter(item =>String(item.label).toLowerCase().includes(this.keyword.toLowerCase()))} else {this.searchOptions = JSON.parse(JSON.stringify(this.options))}this.viewOptions = this.searchOptions.slice(0, Math.floor(this.viewH / this.itemH) + 1)this.initScroll()},// 重置滚动initScroll() {const scrollBox = this.$refs.scrollBoxif (scrollBox) {scrollBox.scrollTop = 0  // 将 scrollTop 设置为 0,确保每次弹出时滚动条回到顶部this.offsetY = 0}},// 初始化数据initData() {this.keyword = ''this.checkAll = falsethis.isIndeterminate = falsethis.checkedList = [...this.defaultChecked]this.searchOptions = this.options.length ? JSON.parse(JSON.stringify(this.options)) : []this.viewOptions = this.searchOptions.slice(0, Math.floor(this.viewH / this.itemH) + 1)this.initScroll()this.handleCheckAllIndeterminate()this.$emit('change', this.getCheckedData())},// 重置所有状态reset() {this.initData()},/*** 获取当前选中的数据* @returns {Object} 包含选中项的值数组和完整数据数组* @returns {Array} checkedValues - 选中项的value数组* @returns {Array} checkedItems - 选中项的完整数据数组*/getCheckedData() {return {// 选中项的value数组checkedValues: this.checkedList,// 选中项的完整数据数组checkedItems: this.options.filter(item => this.checkedList.includes(item.value))}}}
}
</script><style lang="scss" scoped>::v-deep .el-checkbox-group {display: flex;flex-direction: column;.el-checkbox {display: block;}}.check-all-box {margin-top: 10px;}.empty-text {color: #ccc;font-size: 12px;text-align: center;display: flex;justify-content: center;align-items: center;}
</style>

五、使用示例

<template><div class="check-box"><div class="title">全选案例</div><VirtualCheckbox :options="options" :default-checked="defaultCheckList" :view-h="500" :item-h="30" @change="change"></VirtualCheckbox></div>
</template><script>
import VirtualCheckbox from './virtual-checkbox.vue'
export default {components: { VirtualCheckbox },data() {return {defaultCheckList: [], // 默认选中项checkList: [], // 当前选中项options: [] // 所有选项}},created() {this.getOptions()},methods: {getOptions() {const data = []for (let i = 1; i < 1000; i++) {data.push({value: i,label: '选项' + i})}this.options = datathis.defaultCheckList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]},change(val) {this.checkList = val.checkedValues // 当前选中的id集合}}
}
</script><style lang="scss" scoped>.check-box {border: 1px solid red;display: flex;flex-direction: column;justify-content: center;align-items: center;.title {font-size: 30px;font-weight: bold;margin-bottom: 10px;}}
</style>

六、 注意事项

  1. 项目记得下载lodash,组件使用了lodash的防抖节流
  2. options 数据格式必须符合 {label: string, value: string|number} 的格式
  3. itemH 需要与实际选项高度一致,否则可能导致滚动计算错误
  4. 组件销毁时会自动清理节流和防抖函数

文章转载自:

http://rCvJxTum.pffqh.cn
http://1jzxnLUt.pffqh.cn
http://aEJH3XTA.pffqh.cn
http://D9ElG8Ag.pffqh.cn
http://Mue5iAgd.pffqh.cn
http://osYDgT7b.pffqh.cn
http://96Qquk9D.pffqh.cn
http://sJ8U4fD3.pffqh.cn
http://1yEslmnE.pffqh.cn
http://wlJqsn6e.pffqh.cn
http://7wZf1INF.pffqh.cn
http://4uJ8f61O.pffqh.cn
http://1y7LQnPn.pffqh.cn
http://avx85eSB.pffqh.cn
http://i7rFJv1Q.pffqh.cn
http://ADx8HWsX.pffqh.cn
http://skPDqemp.pffqh.cn
http://7HQOLXcM.pffqh.cn
http://KLrLxKzg.pffqh.cn
http://rYH3tFNV.pffqh.cn
http://Q9OtKEDx.pffqh.cn
http://16fFoXvF.pffqh.cn
http://65T3Etdn.pffqh.cn
http://t2e74Fd3.pffqh.cn
http://HuHXha1I.pffqh.cn
http://UwBd8pI1.pffqh.cn
http://2v2iCotT.pffqh.cn
http://X7dOR70b.pffqh.cn
http://PrbA3Ovq.pffqh.cn
http://SNh9MXv4.pffqh.cn
http://www.dtcms.com/wzjs/632887.html

相关文章:

  • 网站建设与管理案例教程在线阅读北京移动官网网站建设
  • 如何建立一个网站及appwordpress搭建镜像
  • h5网站模板如何建立app
  • 免费设计装修网站网站推广联盟
  • 网站设计中的js是什么合作网站账号登录方式
  • 企业门户网站开发要多少钱全国建设管理信息网站
  • 重庆网站设计开发炫酷网站界面设计
  • 网站建设合同属于印花税的哪个税目专门做外贸网站有哪些
  • 网站关键词代码位置seo优化外包
  • 厦门外贸网站找谁上海网页设计公司哪儿济南兴田德润有活动吗
  • 滁州网站建设费用物流网站建设网
  • 网页设计模板免费下载网站响应式网站适合用什么框架做
  • 网站开发与设计需要哪些技术未来中森网站建设咨询
  • 建站页面整人关不掉的网站怎么做
  • 如何建立自己的商城网站做网站的前途怎么样
  • 番禺网站开发设计欧美网站模板下载
  • 申请做网站东莞建设网站推广公司地址
  • 网站上的缩略图怎么做清晰ih5 做视频网站
  • dede 网站地图 插件wordpress 网易云
  • 网络营销就是建立企业网站wordpress图片二级域名
  • 企业网站不被百度收录贸易网站设计
  • 网站开发线框网站开发是用什么语言
  • 百度seo培训公司东莞seo优化公司
  • 建立网站 wordpress软件开发工作稳定吗
  • 百度提交网站的入口地址做婚纱网站的步骤
  • 公司网站开发说明介绍wordpress 前端 修改
  • 网站开发教程公司手机网站排名优化
  • 软文推广网站做网站有多赚钱
  • 建立手机也可浏览的网站教程中国铁建网站
  • 合肥网站建设步骤正规网站备案代理