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 相关文章推荐
详解Vue3 Teleport 的实践及原理
Dec 02 Vue.js
Vue实现图书管理小案例
Dec 03 Vue.js
vue实现购物车的小练习
Dec 21 Vue.js
vue中activated的用法
Jan 03 Vue.js
基于vuex实现购物车功能
Jan 10 Vue.js
vue使用transition组件动画效果的实例代码
Jan 28 Vue.js
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
vue-cropper插件实现图片截取上传组件封装
May 27 Vue.js
Vue过滤器(filter)实现及应用场景详解
Jun 15 Vue.js
vue3使用vuedraggable实现拖拽功能
Apr 06 Vue.js
如何优化vue打包文件过大
Apr 13 Vue.js
Vue 打包后相对路径的引用问题
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
php5中date()得出的时间为什么不是当前时间的解决方法
2008/06/30 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
2019/03/18 PHP
JS复制到剪贴板示例代码
2013/10/30 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
Node.js开发之访问Redis数据库教程
2015/01/14 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
jQuery web 组件 后台日历价格、库存设置的代码
2016/10/14 Javascript
Javascript的this用法
2017/01/16 Javascript
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
Vue render深入开发讲解
2018/04/13 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
vue+iview实现分页及查询功能
2020/11/17 Vue.js
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
[51:17]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
python自动安装pip
2014/04/24 Python
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
python中metaclass原理与用法详解
2019/06/25 Python
python字符串中匹配数字的正则表达式
2019/07/03 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
python使用建议与技巧分享(二)
2020/08/17 Python
职业女性的职业规划
2014/03/04 职场文书
初中毕业生自我评价
2015/03/02 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android