vue3种table表格选项个数的控制方法


Posted in Vue.js onApril 14, 2022

问题描述

提示:这里描述具体问题:我们再用table表格的时候多多少少都会有限制个数的时候,在正常的表格上只有单选或或者多选的样式,没有在多选里面添加最多选几个选项的属性。

例如:我在table表格中只想选择两项。

vue3种table表格选项个数的控制方法

原因分析:

提示:这里填写问题的分析:当前quasar框架不支持个数选择,只能自己来实现。

解决方案:

提示:这里填写该问题的具体解决方案:在选择框中有一个属性是selected-rows-label,这个数属性是当有选择框被点中的时候就会触发。利用这个属性来控制个数。原理是,在table中绑定一个数据,当勾选了一个选项时就会把选择的数据添加到这个数据中,进而会触发selected-rows-label属性,这个属性绑定一个函数,在函数中实现数据属性的长度。当数据长度大于2的时候就设置为2。这样就实现控制选项个数。

例如:下面就是我做的实验。在table可选这数据的时候限制只需选择两项。

下面是页面代码:

<div id="q-app" style="min-height: 100vh;">
  <div class="q-pa-md">
    <q-table
      title="Treats"
      :rows="rows"
      :columns="columns"
      row-key="name"
      :selected-rows-label="getSelectedString"
      selection="multiple"
      v-model:selected="selected"
    ></q-table>

    <div class="q-mt-md">
      Selected: {{ JSON.stringify(selected) }}
    </div>
  </div>
</div>

下面js代码:

const { ref } = Vue

const columns = [
  {
    name: 'desc',
    required: true,
    label: 'Dessert (100g serving)',
    align: 'left',
    field: row => row.name,
    format: val => `${val}`,
    sortable: true
  },
  { name: 'calories', align: 'center', label: 'Calories', field: 'calories', sortable: true },
  { name: 'fat', label: 'Fat (g)', field: 'fat', sortable: true },
  { name: 'carbs', label: 'Carbs (g)', field: 'carbs' },
  { name: 'protein', label: 'Protein (g)', field: 'protein' },
  { name: 'sodium', label: 'Sodium (mg)', field: 'sodium' },
  { name: 'calcium', label: 'Calcium (%)', field: 'calcium', sortable: true, sort: (a, b) => parseInt(a, 10) - parseInt(b, 10) },
  { name: 'iron', label: 'Iron (%)', field: 'iron', sortable: true, sort: (a, b) => parseInt(a, 10) - parseInt(b, 10) }
]

const rows = [
  {
    name: 'Frozen Yogurt',
    calories: 159,
    fat: 6.0,
    carbs: 24,
    protein: 4.0,
    sodium: 87,
    calcium: '14%',
    iron: '1%'
  },
  {
    name: 'Ice cream sandwich',
    calories: 237,
    fat: 9.0,
    carbs: 37,
    protein: 4.3,
    sodium: 129,
    calcium: '8%',
    iron: '1%'
  },
  {
    name: 'Eclair',
    calories: 262,
    fat: 16.0,
    carbs: 23,
    protein: 6.0,
    sodium: 337,
    calcium: '6%',
    iron: '7%'
  },
  {
    name: 'Cupcake',
    calories: 305,
    fat: 3.7,
    carbs: 67,
    protein: 4.3,
    sodium: 413,
    calcium: '3%',
    iron: '8%'
  },
  {
    name: 'Gingerbread',
    calories: 356,
    fat: 16.0,
    carbs: 49,
    protein: 3.9,
    sodium: 327,
    calcium: '7%',
    iron: '16%'
  },
  {
    name: 'Jelly bean',
    calories: 375,
    fat: 0.0,
    carbs: 94,
    protein: 0.0,
    sodium: 50,
    calcium: '0%',
    iron: '0%'
  },
  {
    name: 'Lollipop',
    calories: 392,
    fat: 0.2,
    carbs: 98,
    protein: 0,
    sodium: 38,
    calcium: '0%',
    iron: '2%'
  },
  {
    name: 'Honeycomb',
    calories: 408,
    fat: 3.2,
    carbs: 87,
    protein: 6.5,
    sodium: 562,
    calcium: '0%',
    iron: '45%'
  },
  {
    name: 'Donut',
    calories: 452,
    fat: 25.0,
    carbs: 51,
    protein: 4.9,
    sodium: 326,
    calcium: '2%',
    iron: '22%'
  },
  {
    name: 'KitKat',
    calories: 518,
    fat: 26.0,
    carbs: 65,
    protein: 7,
    sodium: 54,
    calcium: '12%',
    iron: '6%'
  }
]

const app = Vue.createApp({
  setup () {
    const selected = ref([])

    return {
      selected,
      columns,
      rows,

      getSelectedString () {
        if(selected.value.length > 2){
          **selected.value.length = 2**
          return 0
        } else {
          return selected.value.length === 0 ? '' : `${selected.value.length} record${selected.value.length > 1 ? 's' : ''} selected of ${rows.length}`
        }
        
      }
    }
  }
})

app.use(Quasar, { config: {} })
app.mount('#q-app')
Vue.js 相关文章推荐
Vue 实现一个简单的鼠标拖拽滚动效果插件
Dec 10 Vue.js
vue 导航守卫和axios拦截器有哪些区别
Dec 19 Vue.js
vue中配置scss全局变量的步骤
Dec 28 Vue.js
vue调用微信JSDK 扫一扫,相册等需要注意的事项
Jan 03 Vue.js
vue 计算属性和侦听器的使用小结
Jan 25 Vue.js
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
vue使用echarts画组织结构图
Feb 06 Vue.js
手动实现vue2.0的双向数据绑定原理详解
Feb 06 Vue.js
vue3如何优雅的实现移动端登录注册模块
Mar 29 Vue.js
vue+echarts实现多条折线图
Mar 21 Vue.js
vue实力踩坑之push当前页无效
Apr 10 Vue.js
vue css 相对路径导入问题级踩坑记录
Jun 05 Vue.js
vue项目配置sass及引入外部scss文件
Apr 14 #Vue.js
解决vue-router的beforeRouteUpdate不能触发
Apr 14 #Vue.js
vue3语法糖内的defineProps及defineEmits
Apr 14 #Vue.js
vue使用localStorage持久性存储实现评论列表
Apr 14 #Vue.js
vue项目proxyTable配置和部署服务器
Apr 14 #Vue.js
vue组件冲突之引用另一个组件出现组件不显示的问题
Apr 13 #Vue.js
vue elementUI表格控制对应列
Apr 13 #Vue.js
You might like
PHP 中文处理技巧
2010/04/25 PHP
php版淘宝网查询商品接口代码示例
2014/06/17 PHP
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
2016/04/28 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
JQuery+Ajax无刷新分页的实例代码
2014/02/08 Javascript
jQuery简单实现隐藏以及显示特效
2015/02/26 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
2016/12/13 Javascript
原生JavaScript实现Tooltip浮动提示框特效
2017/03/07 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
2017/12/09 Javascript
JS简单生成由字母数字组合随机字符串示例
2018/05/25 Javascript
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
JS前后端实现身份证号验证代码解析
2020/07/23 Javascript
vue-cli3 热更新配置操作
2020/09/18 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
Python 常用 PEP8 编码规范详解
2017/01/22 Python
python3的输入方式及多组输入方法
2018/10/17 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
解决springboot yml配置 logging.level 报错问题
2020/02/21 Python
关于Python字符串显示u...的解决方式
2020/03/06 Python
python 实现简易的记事本
2020/11/30 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
python绘制雷达图实例讲解
2021/01/03 Python
印尼旅游网站:via
2017/11/12 全球购物
CAT鞋加拿大官网:CAT Footwear加拿大
2020/08/05 全球购物
大学生校园创业计划书
2014/02/08 职场文书
保证书格式范文
2014/04/28 职场文书
研究生导师推荐信
2014/09/06 职场文书
2015年医德医风工作总结
2015/04/02 职场文书
《钓鱼的启示》教学反思
2016/02/18 职场文书
SQLServer之常用函数总结详解
2021/08/30 SQL Server
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
2022/07/15 Java/Android