antd-vue table 分页缓存已勾选数据

<a-table
  size="small" bordered
  rowKey={this.rowKey}
  row-selection={{
    type: this.selectType,
    selectedRows: this.selectedRows,
    selectedRowKeys: this.selectedRowKeys,
    onChange: this.handleSelectChange.bind(this),
  }}
  scroll={ { y: 600 } } pagination={true}
  pagination={this.pagination}
  on-change={this.tableChange}
  data-source={this.tableData}
  columns={columns.call(this, h)}
  {...{ scopedSlots: this.scopedSlotsList }}
/>

分页

<a-table
  ......
  scroll={ { y: 600 } } pagination={true}
  pagination={this.pagination}
  on-change={this.tableChange}
  ......
/>

分页配置

pagination: {
  total: 0, // 数据总数
  current: 1, // 当前页数
  defaultPageSize: 100, // 默认每页显示10条数据
  showTotal: null, // 展示总共有几条数据
  showSizeChanger: false, // 显示修改pageSize的下拉框
  pageSizeOptions: ['100'], // 设置pageSize的可选值,页面可以通过下拉框进行选择
  onShowSizeChange: (current, pageSize) => {
    this.pageSize = pageSize
  }
},

数据请求

async getList (paging) {
  if (!this.method) return
  if (!this.init) {
    return {
      rows: [],
    }
  }
  const fn = this.method
  const { data = {} } = await fn({
    ...this.paramValue,
    ...this.cacheQuery,
    ...paging,
    pageSize: this.pageSize,
    currentNo: this.pagination.current,
  })

  let rows = ([...data.rows] || []).map(item => {
    // 缓存 已勾选的数据
    if (this.selectedRowKeys.length && this.selectedRowKeys.includes(item[this.rowKey])) {
      const row = this.selectedRows.find(row => row[this.rowKey] === item[this.rowKey]) || {}
      return { ...item, qcAssistQty: row.qcAssistQty || 0, qcMainQty: row.qcMainQty || 0 }
    }
    return {
      ...item,
      qcAssistQty: item.assistQty || item.inInventoryAssistQty || 0,
      qcMainQty: item.mainQty || item.inInventoryQty || 0,
    }
  })
  this.tableData = rows
  this.pagination.total = data.totalElements || 0 // 总页数
  return { ...data, data: { rows } }
},

分页方法

tableChange (pagination, filters, sorter) {
  this.pagination = pagination
  this.getList()
},

搜索查询

handleSearch (query = {}) {
  this.init = true
  this.cacheQuery = { ...query }
  this.pagination.current = 1
  this.handleRefresh()
},

// 刷新数据
handleRefresh () {
  this.init = true
  this.clearSelected()
  this.getList()
},

// 清空勾选数据
clearSelected () {
  this.handleSelectChange([], [])
},

勾选数据

通过 rowSelection.selectedRowKeys 来控制选中项; 通过 rowSelection.selectedRows 来控制选择行数据, 当然我们也可以使用 rowSelection.selections 自定义选择配置项, 设为 true 时使用默认选择项.

对于带有分页的 table 数据, 如何处理勾选数据呢?

由于 selectedRowKeys 可以记录所有勾选的数据的 ID, 而 selectedRows 只会记录当前页选中项.

handleSelectChange (selectedRowKeys, selectedRows) {
  this.updateSelect(selectedRowKeys, selectedRows)
  this.$emit('select', this.selectedRows)
},
// 缓存已勾选的 selectedRows
updateSelect (selectedRowKeys, selectedRows) {
  let keyLength = selectedRowKeys.length
  let rowLength = this.selectedRows.length
  if (keyLength > rowLength) {
    // 不添加重复项
    selectedRows.forEach((row) => {
      let idx = this.selectedRows.findIndex((item) => item[this.rowKey] === row[this.rowKey])
      if (idx === -1) {
        this.selectedRows.push(row)
      }
    })
  } else {
    // 剔除反选项
    this.selectedRows = this.selectedRows.reduce((list, row) => {
      if (selectedRowKeys.includes(row[this.rowKey])) {
        list.push(row)
      }
      return list
    }, [])
  }
  this.selectedRowKeys = [...new Set(selectedRowKeys)]
},

默认勾选

通过 rowSelection.getCheckboxProps 来配置选择框的默认属性配置.

<a-table
  ....
  row-selection={{
    getCheckboxProps: record => {
      return {
        props: {
          defaultChecked: this.selectedRowKeys.includes(record[this.rowKey]),
        },
      }
    },
    selectedRowKeys: this.selectedRowKeys,
    onChange: this.handleSelectChange.bind(this),
  }}
  ......
/>

在初始化数据的时候, 我们需要添加选中的项.

async getInit () {
  // 调用接口
  this.selectedRows = data
  this.selectedRowKeys = data.filter(item => item.age > 17).map(item => item[this.rowKey])
},

勾选数据 table 列校验

computed: {
  // 异步规则
  asyncRules () {
    return function (record, key) {
      if (this.selectedRowKeys.includes(record[this.rowKey])) {
        return {
          validator: (rule, value, callback) => {
            return this.handleRule(key, value, record, callback)
          },
        }
      }
    }
  },
  // 作用域插槽
  scopedSlotsList () {
    const obj = {}
    Array.prototype.forEach.call(['qcAssistQty', 'qcMainQty'], item => {
      obj[item] = (text, record, index) => {
        return <cell-validate mode="a-input-number" class="w140"
          validateProp={`${item}${index}`}
          validators={validators}
          rules={this.asyncRules(record, item)}
          v-model={this.tableData[index][item]} />
      }
    })
    return obj
  },
},

校验规则

handleRule (key, value, record, callback) {
  if (Number(value) === 0) {
    return callback(new Error('数量不能为0'))
  }
  if (!Reg.numUnit(value)) {
    return callback(new Error('最多保留六位小数'))
  }
  ......
  return callback()
},

对勾选数据校验(包含非当前页勾选数据)。

// 对勾选数据校验
async handleSelectValidate () {
  const length = this.selectedRows.length
  // 未勾选,无需校验
  if (length === 0) {
    return Promise.resolve(true)
  }
  for (let index = 0; index < length; index++) {
    const rows = this.selectedRows[index]
    for await (let key of Object.keys(rows)) {
      if (['qcAssistQty', 'qcMainQty'].includes(key)) {
        try {
          await this.handleRule(key, rows[key], rows, function (err) {
            if (err) {
              throw new Error(err)
            }
          })
        } catch (error) {
          return Promise.resolve(false)
        }
      }
    }
  }
  return Promise.resolve(true)
},
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: antd-mobile-vue是一个基于Vue.js框架的移动端组件库,它提供了一系列UI组件,用于开发高质量的移动端应用。 与其它UI组件库相比,antd-mobile-vue具有以下优势和特点: 1. 高质量的组件:antd-mobile-vue提供了丰富的移动端UI组件,如按钮、表单、弹窗、导航等,这些组件都经过了精心设计和开发,具有统一的风格和良好的用户体验。 2. 灵活的布局:antd-mobile-vue提供了灵活的布局组件,如栅格布局、Flex布局,可帮助开发者快速搭建页面结构,并自适应不同的屏幕尺寸。 3. 易于使用和扩展:antd-mobile-vue的组件使用简单,开发者可以通过简单的配置和参数就可以实现复杂的交互效果。而且,antd-mobile-vue的组件提供了丰富的扩展能力,可以根据项目需求进行个性化的定制。 4. 生态丰富:antd-mobile-vue拥有庞大的开发者社区和活跃的维护团队,开发者可以通过官方文档和社区资源获取帮助和支持。此外,antd-mobile-vue还与其它Vue.js生态工具和库良好地兼容,如Vue Router、Vue CLI等。 5. 支持国际化:antd-mobile-vue提供了多语言支持,开发者可以根据项目需求灵活地切换多种语言环境。 总之,antd-mobile-vue是一个功能强大、易于使用和扩展的移动端组件库,它可以帮助开发者快速构建高质量的移动端应用,提高开发效率和用户体验。 ### 回答2: antd-mobile-vue是一种基于Vue.js框架的移动端UI库。它是对Ant Design Mobile的Vue组件实现的封装和扩展,旨在为开发者提供高质量、易用性的移动端组件库,帮助快速开发移动应用程序。 antd-mobile-vue提供了丰富的移动端UI组件,如按钮、导航栏、标签栏、列表、表单等,可以满足日常开发中绝大部分的界面需求。这些组件都经过精心设计和优化,在视觉和交互上都符合当前移动端的设计原则和用户体验。而且,它还提供了灵活的定制和扩展能力,允许开发者根据具体需求进行个性化定制,提高开发效率和用户体验。 除了UI组件外,antd-mobile-vue还提供了一些实用的工具和功能,如样式工具库、语言国际化、路由管理等。这些工具和功能都是为了让开发者更方便地进行移动应用开发,减少重复性的工作,提高开发效率。 antd-mobile-vue拥有广泛的社区支持和文档资料,开发者可以从社区中获取帮助和解决问题,学习和掌握使用该库的技巧和最佳实践。同时,antd-mobile-vue还提供了详细的官方文档和示例代码,方便开发者快速入手和上手该库。 总之,antd-mobile-vue是一款功能强大、易用性强的移动端UI库,适用于各种移动应用的开发。无论是个人开发者还是团队开发,都可以通过使用antd-mobile-vue来快速构建高质量的移动应用程序。 ### 回答3: antd-mobile-vue 是一个基于 Vue.js 的移动端 UI 组件库,它提供了丰富的移动端组件和样式风格,可以帮助开发者快速构建优雅的移动端应用。 antd-mobile-vue 的特点有以下几个方面: 1. 高度可定制:antd-mobile-vue 提供了大量的组件,涵盖了移动端常见的UI元素,如按钮、导航栏、表单等,这些组件的样式和交互行为都可以通过配置进行定制,满足不同项目的需求。 2. 兼容性强:antd-mobile-vue 提供了对不同移动端浏览器和操作系统的支持,保证组件在不同环境下的正常运行和展示,同时也保证了用户的使用体验。 3. 特色设计:antd-mobile-vue 的设计风格简洁、现代,符合移动端用户的审美要求,同时也遵循了 Material Design 和 iOS Human Interface Guidelines 等设计准则,保证了用户的熟悉感和易用性。 4. 文档丰富:antd-mobile-vue 提供了详细的文档和示例代码,开发者可以根据文档了解组件的使用方法和配置参数,快速上手使用。 5. 生态丰富:antd-mobile-vue 是基于 Ant Design Mobile(antd-mobile)的 Vue 实现,可以与其它 Vue 生态工具和插件无缝集成,如 Vue Router、Vuex 等,方便开发者构建复杂的移动应用。 总之,antd-mobile-vue 是一个强大而灵活的移动端 UI 组件库,它可以帮助开发者节省时间和精力,快速开发出高质量的移动应用。无论是个人项目还是企业应用,都可以考虑使用这个库来提升开发效率和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值