Vue搜索框实现indexedList索引列表功能,锚点跳转--代码记录

@PC端搜索框实现index索引列表功能–代码记录

实现效果

在这里插入图片描述

领导提出莫名奇妙的需求,实现效果如上图,直接上代码

父级代码

			<el-popover
              placement="bottom"
              width="250"
              v-model="visible">//这里使用的是element-ui组件
              <index-list class="indexArea" @closeList='closeList'></index-list>//index索引列表
              <el-form-item label="品牌" slot="reference">
                <el-input :value="inpVal"></el-input>
              </el-form-item>
            </el-popover>  

index索引列表代码

<template>
    <div class="menu">
        <div class="city_menu_container" @scroll="onScroll">//滚动区域,滚动事件
            <div class="area" v-for="(item,index) in option" :key="index" >
                <div class="itemTit" ref="item.letter" :id='item.letter'>{{item.letter}}</div>
                <div class="item action" :class="{active_brand: brandIndex === newIndex && wortIndex === index}" v-for="(list,newIndex) in item.data" :key="newIndex" @click="chose(list,index,newIndex)">{{list}}</div>
            </div>
        </div>
        <ul class="city_list_container">
            <li v-for="(item,index) in wortList" :key="index" :class="{active: activeIndex === index }" @click="jump(index)">{{item}}</li>
        </ul>
    </div>
</template>

列表数据格式
在这里插入图片描述

通过scroll事件监听滚动

		onScroll (e) {
            let scrollItems = document.querySelectorAll('.itemTit')
            for (let i = scrollItems.length - 1; i >= 0; i--) {
                // 判断滚动条滚动距离是否大于当前滚动项可滚动距离
                let judge = e.target.scrollTop >= scrollItems[i].offsetTop - scrollItems[0].offsetTop
                if (judge) {
                this.activeStep = i
                break
                }
            }
        },

根据点击侧边栏索引实现指定滚动动画效果

		jump (index) {
            this.activeIndex = index
            let target = document.querySelector('.city_menu_container')
            let scrollItems = document.querySelectorAll('.area')
            // 判断滚动条是否滚动到底部
            if (target.scrollHeight <= target.scrollTop + target.clientHeight) {
            this.activeStep = index
            }
            console.log(this.activeIndex,index);
            let roll = scrollItems[index].offsetTop - scrollItems[0].offsetTop // 锚点元素距离其滚动窗口顶部的距离(待滚动的距离)
            let distance = document.querySelector('.city_menu_container').scrollTop // 滚动条距离滚动区域顶部的距离
            // 滚动条距离滚动区域顶部的距离(滚动区域为窗口)
            // 滚动动画实现, 使用setTimeout的递归实现平滑滚动,将距离细分为10小段,10ms滚动一次
            // 计算每一小段的距离
            let step = roll / 10
            if (roll > distance) {
                rollDown(target)
            } else {
                let newTotal = distance - roll
                step = newTotal / 10
                rollUp(target)
            }
            // node为滚动区域节点
            function rollDown (node) {
                if (distance < roll) {
                    distance += step
                    node.scrollTop = distance
                    setTimeout(rollDown.bind(this, node), 10)
                } else {
                    node.scrollTop = roll
                }
            }
            // node为滚动区域节点
            function rollUp (node) {
                if (distance > roll) {
                    distance -= step
                    node.scrollTop = distance
                    setTimeout(rollUp.bind(this, node), 10)
                } else {
                    node.scrollTop = roll
                }
            }
        }

最后通过调用父组件的方法关闭窗口,并传参

		chose(e,index,newIndex) {
            this.brandIndex = newIndex
            this.wortIndex = index
            this.$emit('closeList',e)
        },

父组件方法

	closeList(val) {
      this.inpVal = val
      this.visible = false
    }

这样基本效果就基本完成了,略有不足,请多多纠正。

时隔这么久,终于对此组件优化了,这里新增了输入筛选,单选多选,数据的双向绑定,查看可访问Vue2搜索框实现indexedList索引列表-锚点跳转,附带数据动态绑定、多选、单选、搜索功能

这里非常感谢 http://www.jb51.net/article/110325.htm 这篇文章带来的启发。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要在 Vue 中使用 `el-table` 添加搜索框实现简单搜索功能,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装并引入了 Element UI 库,以便使用 `el-table` 和其他组件。 2. 在 Vue 组件中,定义一个数据属性 `searchText` 用于存储搜索框中的文本输入。 3. 在 `el-table` 中的表头部分,添加一个额外的列用于放置搜索框组件。 4. 在搜索框组件中,使用 `v-model` 绑定 `searchText` 属性,以便实时获取搜索框中的文本输入。 5. 在表格的数据源中,使用计算属性或方法来过滤符合搜索条件的数据。 6. 在搜索框的事件处理程序中,调用过滤数据的方法或更新计算属性,以实现数据的动态过滤。 下面是一个示例代码,演示了如何在 Vue 中添加搜索框实现简单搜索功能: ```vue <template> <div> <el-input v-model="searchText" placeholder="输入关键字搜索"></el-input> <el-table :data="filteredData"> <el-table-column label="姓名" prop="name"></el-table-column> <el-table-column label="年龄" prop="age"></el-table-column> <el-table-column label="邮箱" prop="email"></el-table-column> </el-table> </div> </template> <script> export default { data() { return { searchText: '', tableData: [ { name: '张三', age: 25, email: 'zhangsan@example.com' }, { name: '李四', age: 30, email: 'lisi@example.com' }, { name: '王五', age: 28, email: 'wangwu@example.com' } ] }; }, computed: { filteredData() { if (!this.searchText) { return this.tableData; } const searchText = this.searchText.toLowerCase(); return this.tableData.filter(item => { return ( item.name.toLowerCase().includes(searchText) || item.email.toLowerCase().includes(searchText) ); }); } } }; </script> ``` 在上述代码中,我们在 `el-input` 组件中使用 `v-model` 绑定了 `searchText` 属性,用于实时获取搜索框中的文本输入。然后,我们在 `el-table` 的表头部分添加了一个额外的列,用于放置搜索框组件。 在数据源中,我们使用了一个名为 `tableData` 的数组来存储表格的数据。我们使用计算属性 `filteredData` 来过滤符合搜索条件的数据。如果 `searchText` 为空,则返回所有数据;否则,我们将搜索框中的文本转换为小写并与每一项的姓名和邮箱进行比较,返回包含搜索文本的数据项。 这样,当你在搜索框中输入关键字时,表格将根据输入进行动态过滤,并只显示符合条件的数据项。 请注意,在实际项目中,你可能需要从后端获取数据并进行搜索,这里的示例代码只是一个简单的演示。你可以根据自己的需求进行修改和扩展。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值