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

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕

共同探索软件研发!敬请关注【宝码香车】
关注描述

csdngif标识

目录

  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序
    • 📚页面效果
    • 📚指令输入
      • 定义属性
        • 数据相关
        • 样式与布局相关
        • 功能相关
      • 定义事件
      • 其他
    • 📚think
      • 📘组件代码
    • 📚代码测试
    • 📚示例2,整理后主要代码
      • 📘定义组件 \src\views\TableView2.vue
    • 📚测试代码正常跑通,附其他基本代码
      • 📘编写路由 src\router\index.js
      • 📘编写展示入口 src\App.vue
    • 📚页面效果
    • 📚展望


📚📗📕📘📖🕮💡📝🗂️✍️🛠️💻🚀🎉🏗️🌐🖼️🔗📊👉🔖⚠️🌟🔐⬇️·正文开始⬇️·🎥😊🎓📩😺🌈🤝🤖📜📋🔍✅🧰❓📄📢📈 🙋0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣🔟🆗*️⃣#️⃣

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2: 分页和排序

📚页面效果

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例2分页和排序

📚指令输入

已经创建好了一个基于Vue3的组合式API的项目(Composition API),并能正常运行起来,请帮我用 Vue3的组合式API(Composition API) 生成一个 表格(Table) 的功能组件,所有代码都保存在components/Table 下的文件夹中。功能组件的script标签中只有setup属性,使用普通 JavaScript 实现,不使用TypeScript。
功能要有,如下属性:

定义属性

数据相关
  1. data
    • 作用:表格展示的数据,是一个数组,每个元素代表一行记录。
    • 类型:Array<Object>
    • 默认值:[]
  2. columns
    • 作用:定义表格的列配置,每个元素包含列标题、数据字段名、对齐方式等信息。
    • 类型:Array<Object>
    • 默认值:[]
    • 示例:[{ title: '姓名', dataIndex: 'name', align: 'left' }]
  3. pagination
    • 作用:是否开启分页功能。
    • 类型:Boolean
    • 默认值:false
  4. pageSize
    • 作用:每页显示的记录数。
    • 类型:Number
    • 默认值:10
  5. currentPage
    • 作用:当前显示的页码,支持双向绑定。
    • 类型:Number
    • 默认值:1
样式与布局相关
  1. stripe
    • 作用:是否显示斑马纹效果。
    • 类型:Boolean
    • 默认值:false
  2. border
    • 作用:是否显示表格边框。
    • 类型:Boolean
    • 默认值:false
  3. size
    • 作用:表格的尺寸,如 smallmediumlarge
    • 类型:String
    • 默认值:'medium'
  4. headerAlign
    • 作用:表头内容的对齐方式,如 leftcenterright
    • 类型:String
    • 默认值:'left'
  5. cellAlign
    • 作用:表格单元格内容的对齐方式,如 leftcenterright
    • 类型:String
    • 默认值:'left'
功能相关
  1. rowSelection
    • 作用:是否开启行选择功能。
    • 类型:Boolean
    • 默认值:false
  2. selectedRows
    • 作用:双向绑定当前选中的行数据,支持 v-model 语法。
    • 类型:Array<Object>
    • 默认值:[]
  3. sortable
    • 作用:是否开启列排序功能。
    • 类型:Boolean
    • 默认值:false
  4. sortedColumn
    • 作用:当前排序的列信息,包括列字段名和排序顺序(ascdesc)。
    • 类型:Object
    • 默认值:{ field: null, order: null }

定义事件

  1. update:currentPage
    • 作用:当页码发生变化时触发,用于实现 currentPage 的双向绑定。
    • 参数:Number,新的页码。
  2. update:selectedRows
    • 作用:当选中的行发生变化时触发,用于实现 selectedRows 的双向绑定。
    • 参数:Array<Object>,新的选中行数据。
  3. update:sortedColumn
    • 作用:当排序的列发生变化时触发,用于实现 sortedColumn 的双向绑定。
    • 参数:Object,新的排序列信息。
  4. rowClick
    • 作用:当点击表格某一行时触发。
    • 参数:Object,被点击行的数据。
  5. sortChange
    • 作用:当列排序发生变化时触发。
    • 参数:{ field, order },排序的列字段名和排序顺序。
  6. paginationChange
    • 作用:当分页参数(如页码、每页记录数)发生变化时触发。
    • 参数:{ currentPage, pageSize },新的页码和每页记录数。

其他

  1. 提供插槽:使用 Vue 的插槽机制,允许用户自定义表头内容、表格单元格内容、分页器样式等,增加组件的灵活性。例如,用户可以自定义某一列的显示格式。
  2. 虚拟列表支持:当数据量很大时,使用虚拟列表技术,只渲染当前可见区域的数据,提高性能。
  3. 搜索与过滤功能:添加搜索框和过滤条件,方便用户快速查找和筛选数据。
  4. 国际化支持:支持不同语言的表头、分页器文字等,方便不同地区的用户使用。
  5. 键盘交互:支持通过键盘操作表格,如使用方向键移动焦点、回车键选中行等,提升用户操作体验。
  6. 样式定制:提供一些样式类名或 CSS 变量,方便用户自定义表格的样式,如颜色、字体、边框等。
  7. 文档和示例:编写详细的文档,说明每个属性和事件的作用,并提供多种使用示例,方便其他开发者使用该组件。例如,展示如何实现分页、排序、行选择等功能。

你有更好的建议也可以添加,要注明。组件定义好后给出5个及以上的调用示例,示例中添加完整的数据和事件,确保每个示例是独立的。
下面是现有目录
DeepSeekAndVue/
├── src/ # 源代码目录
│ ├── assets/ # 静态资源
│ │ ├── base.css
│ │ ├── main.css
│ │ └── logo.svg
│ ├── components/ # 组件目录
│ │ ├── HelloWorld.vue
│ │ ├── TheWelcome.vue
│ │ ├── WelcomeItem.vue
│ │ ├── Progress/
│ │ │ └── Progress.vue
│ │ ├── Accordion/
│ │ ├── BackToTop/
│ │ ├── Card/
│ │ ├── InfiniteScroll/
│ │ ├── Notification/
│ │ ├── Timeline/
│ │ ├── Switch/
│ │ ├── Tabs/
│ │ ├── Sidebar/
│ │ ├── Breadcrumbs/
│ │ ├── MasonryLayout/
│ │ ├── Rating/
│ │ ├── ColorPicker/
│ │ ├── RightClickMenu/
│ │ ├── RangePicker/
│ │ ├── Navbar/
│ │ ├── FormValidation/
│ │ ├── CopyToClipboard/
│ │ ├── ClickAnimations/
│ │ ├── ThumbnailList/
│ │ ├── KeyboardShortcuts/
│ │ ├── CommentSystem/
│ │ ├── QRCode/
│ │ ├── RadioButton/
│ │ ├── Slider/
│ │ ├── ScrollAnimations/
│ │ ├── TextInput/
│ │ ├── Divider/
│ │ ├── Checkbox/
│ │ ├── TagInput/
│ │ ├── DropdownSelect/
│ │ ├── List/
│ │ ├── Header/
│ │ ├── Footer/
│ │ ├── Pagination/
│ │ ├── FloatingActionButton/
│ │ ├── PasswordInput/
│ │ ├── GridLayout/
│ │ ├── Flexbox/
│ │ ├── Modal/
│ │ ├── RichTextEditor/
│ │ ├── TimePicker/
│ │ ├── FileUpload/
│ │ ├── Autocomplete/
│ │ ├── MultistepForm/
│ │ ├── SearchBar/
│ │ ├── DynamicFormFields/
│ │ ├── Table/
│ │ ├── DatePicker/
│ │ └── icons/
│ ├── router/ # 路由配置
│ │ └── index.js
│ ├── stores/ # Pinia 状态管理
│ │ └── counter.js
│ ├── views/ # 页面组件
│ │ ├── ProgressView.vue
│ │ ├── TabsView.vue
│ │ ├── SwitchView.vue
│ │ ├── TimelineView.vue
│ │ ├── NotificationView.vue
│ │ ├── CardView.vue
│ │ ├── InfiniteScrollView.vue
│ │ ├── BackToTopView.vue
│ │ ├── AccordionView.vue
│ │ ├── SidebarView.vue
│ │ ├── BreadcrumbsView.vue
│ │ ├── MasonryLayoutView.vue
│ │ ├── RatingView.vue
│ │ ├── ColorPickerView.vue
│ │ ├── RightClickMenuView.vue
│ │ ├── RangePickerView.vue
│ │ ├── NavbarView.vue
│ │ ├── FormValidationView.vue
│ │ ├── CopyToClipboardView.vue
│ │ ├── ClickAnimationsView.vue
│ │ ├── ThumbnailListView.vue
│ │ ├── KeyboardShortcutsView.vue
│ │ ├── CommentSystemView.vue
│ │ ├── QRCodeView.vue
│ │ ├── RadioButtonView.vue
│ │ ├── SliderView.vue
│ │ ├── ScrollAnimationsView.vue
│ │ ├── TextInputView.vue
│ │ ├── DividerView.vue
│ │ ├── CheckboxView.vue
│ │ ├── TagInputView.vue
│ │ ├── DropdownSelectView.vue
│ │ ├── ListView.vue
│ │ ├── HeaderView.vue
│ │ ├── FooterView.vue
│ │ ├── PaginationView.vue
│ │ ├── FloatingActionButtonView.vue
│ │ ├── GridLayoutView.vue
│ │ ├── PasswordInputView.vue
│ │ ├── FlexboxView.vue
│ │ ├── ModalView.vue
│ │ ├── RichTextEditorView.vue
│ │ ├── TimePickerView.vue
│ │ ├── FileUploadView.vue
│ │ ├── AutocompleteView.vue
│ │ ├── MultistepFormView.vue
│ │ ├── SearchBarView.vue
│ │ ├── DynamicFormFieldsView.vue
│ │ ├── TableView.vue
│ │ ├── DatePickerView.vue
│ │ └── AboutView.vue
│ ├── App.vue # 根组件
│ └── main.js # 应用入口
├── public/ # 公共资源目录
├── index.html # HTML 模板
├── package.json # 项目配置
├── vite.config.js # Vite 配置
└── node_modules/ # 依赖包目录

📚think

📘组件代码

我将按照您的要求创建一个功能完善的Table组件,并给出多个使用示例。以下是实现步骤:

  1. 首先创建组件文件:components/Table/Table.vue
<!-- components/Table/Table.vue -->
<template>
  <div class="ds-table" :class="[`table-size-${size}`, { 'table-stripe': stripe, 'table-border': border }]">
    <!-- 搜索框 -->
    <div v-if="showSearch" class="table-search">
      <input
        v-model="searchKeyword"
        placeholder="搜索..."
        @input="handleSearch"
        class="search-input"
      />
    </div>

    <!-- 表格主体 -->
    <div class="table-container">
      <table>
        <thead>
          <tr>
            <!-- 选择列 -->
            <th 
              v-if="rowSelection" 
              :class="headerAlignClass"
              class="selection-column"
            >
              <input
                type="checkbox"
                :checked="allSelected"
                @change="toggleAllSelection"
              />
            </th>
            
            <!-- 数据列 -->
            <th
              v-for="col in columns"
              :key="col.dataIndex"
              :class="[headerAlignClass, { sortable: sortable && col.sortable }]"
              @click="handleSort(col)"
            >
              <slot :name="`header-${col.dataIndex}`" :column="col">
                {
  { col.title }}
                <span v-if="sortable && col.sortable" class="sort-icon">
                  {
  { sortedColumn.field === col.dataIndex ? 
                    (sortedColumn.order === 'asc' ? '↑' : '↓') : '' }}
                </span>
              </slot>
            </th>
          </tr>
        </thead>
        
        <tbody>
          <!-- 虚拟列表占位 -->
          <template v-if="virtualScroll">
            <tr
              v-for="row in visibleData"
              :key="rowKey ? row[rowKey] : row.id"
              :class="{ 'selected-row': isRowSelected(row) }"
              @click="handleRowClick(row)"
            >
              <!-- 选择列 -->
              <td v-if="rowSelection" :class="cellAlignClass">
                <input
                  type="checkbox"
                  :checked="isRowSelected(row)"
                  @change="toggleRowSelection(row)"
                />
              </td>
              
              <!-- 数据列 -->
              <td
                v-for="col in columns"
                :key="col.dataIndex"
                :class="cellAlignClass"
              >
                <slot :name="`cell-${col.dataIndex}`" :row="row" :value="row[col.dataIndex]">
                  {
  { row[col.dataIndex] }}
                </slot>
              </td>
            </tr>
          </template>
          
          <!-- 普通列表 -->
          <template v-else>
            <tr
              v-for="(row, index) in processedData"
              :key="rowKey ? row[rowKey] : index"
              :class="{ 'selected-row': isRowSelected(row), 'stripe-row': stripe && index % 2 === 0 }"
              @click="handleRowClick(row)"
            >
              <!-- 同上 -->
            </tr>
          </template>
        </tbody>
      </table>
    </div>

    <!-- 分页 -->
    <div v-if="pagination" class="table-pagination">
      <button 
        :disabled="currentPage === 1"
        @click="changePage(currentPage - 1)"
      >
        上一页
      </button>
      <span>第 {
  { currentPage }} 页 / 共 {
  { totalPages }} 页</span>
      <button
        :disabled="currentPage >= totalPages"
        @click="changePage(currentPage + 1)"
      >
        下一页
      </button>
    </div>
  </div>
</template>

<script setup>
import {
      ref, computed, watch, toRefs } from 'vue'

const props = defineProps({
     
  // 数据相关
  data: {
     
    type: Array,
    default: () => []
  },
  columns: {
     
    type: Array,
    default: () => []
  },
  pagination: {
     
    type: Boolean,
    default: false
  },
  pageSize: {
     
    type: Number,
    default: 10
  },
  currentPage: {
     
    type: Number,
    default: 1
  },
  
  // 样式相关
  stripe: Boolean,
  border: Boolean,
  size: {
     
    type: String,
    default: 'medium',
    validator: v => ['small', 'medium', 'large'].includes(v)
  },
  headerAlign: {
     
    type: String,
    default: 'left',
    validator: v => ['left', 'center', 'right'].includes(v)
  },
  cellAlign: {
     
    type: String,
    default: 'left',
    validator: v => ['left', 'center', 'right'

http://www.kler.cn/a/572097.html

相关文章:

  • Python----数据分析(Matplotlib三:绘图二:箱图,散点图,饼图,热力图,3D图)
  • anolis8.9-k8s1.32-系统基本配置
  • Tomcat原理:HTTP协议与HTTPS协议
  • FastGPT 源码:RRF、Rerank 相关代码
  • Spring Boot 中短时间连续请求时出现Cookie获取异常问题
  • uniapp+vue3搭建项目
  • 【powerjob】 powerjobserver注册服务IP错误
  • .h264/.h265文件 前端直接播放
  • 2 Redis 字符串(String) 命令大全
  • 【TCP/IP协议栈】【网络层】子网划分、子网掩码
  • STM32程序的加密与破解以及烧录方法
  • FastGPT 引申:基于 Python 版本实现 Java 版本 RRF
  • Kali CentOs 7代理
  • 【华为OD机试真题29.9¥】(E卷,100分) - IPv4地址转换成整数(Java Python JS C++ C )
  • vmware虚拟机安装银河麒麟高级服务器操作系统V10
  • 物联网感应层数据采集器实现协议转换 数据格式化
  • .NET内存居高不下排查怎么解决
  • 4-3自定义加载器,并添加功能
  • 策略模式的C++实现示例
  • Python 图像处理之 Pillow 库:玩转图片