123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- <template>
- <j-vxe-table
- ref="vTable"
- toolbar
- row-number
- row-selection
- drag-sort
- keep-source
- :height="580"
- :loading="loading"
- :dataSource="dataSource"
- :columns="columns"
- style="margin-top: 8px;"
- @valueChange="handleValueChange"
- >
- <template v-slot:toolbarSuffix>
- <a-button @click="handleTableCheck">表单验证</a-button>
- <a-tooltip placement="top" title="获取值,忽略表单验证" :autoAdjustOverflow="true">
- <a-button @click="handleTableGet">获取值</a-button>
- </a-tooltip>
- <a-tooltip placement="top" title="模拟加载1000条数据" :autoAdjustOverflow="true">
- <a-button @click="handleTableSet">设置值</a-button>
- </a-tooltip>
- </template>
- <template v-slot:action="props">
- <a @click="handleCK(props)">查看</a>
- <a-divider type="vertical"/>
- <a-popconfirm title="确定删除吗?" @confirm="handleDL(props)">
- <a>删除</a>
- </a-popconfirm>
- </template>
- </j-vxe-table>
- </template>
- <script>
- import moment from 'moment'
- import { pushIfNotExist, randomNumber, randomUUID } from '@/utils/util'
- import { JVXETypes } from '@/components/jeecg/JVxeTable'
- export default {
- name: 'JVxeDemo1',
- data() {
- return {
- loading: false,
- columns: [
- {
- title: '不可编辑',
- key: 'normal',
- type: JVXETypes.normal,
- width: '180px',
- fixed: 'left',
- defaultValue: 'normal-new',
- },
- {
- title: '单行文本',
- key: 'input',
- type: JVXETypes.input,
- width: '180px',
- defaultValue: '',
- placeholder: '请输入${title}',
- validateRules: [
- {
- required: true, // 必填
- message: '请输入${title}' // 显示的文本
- },
- {
- pattern: /^[a-z|A-Z][a-z|A-Z\d_-]*$/, // 正则
- message: '${title}必须以字母开头,可包含数字、下划线、横杠'
- },
- {
- unique: true,
- message: '${title}不能重复'
- },
- {
- handler({cellValue, row, column}, callback, target) {
- // cellValue 当前校验的值
- // callback(flag, message) 方法必须执行且只能执行一次
- // flag = 是否通过了校验,不填写或者填写 null 代表不进行任何操作
- // message = 提示的类型,默认使用配置的 message
- // target 行编辑的实例对象
- if (cellValue === 'abc') {
- callback(false, '${title}不能是abc') // false = 未通过校验
- } else {
- callback(true) // true = 通过验证
- }
- },
- message: '${title}默认提示'
- }
- ]
- },
- {
- title: '多行文本',
- key: 'textarea',
- type: JVXETypes.textarea,
- width: '200px',
- },
- {
- title: '数字',
- key: 'number',
- type: JVXETypes.inputNumber,
- width: '80px',
- defaultValue: 32,
- // 【统计列】sum = 求和、average = 平均值
- statistics: ['sum', 'average'],
- },
- {
- title: '下拉框',
- key: 'select',
- type: JVXETypes.select,
- width: '180px',
- // 下拉选项
- options: [
- {title: 'String', value: 'string'},
- {title: 'Integer', value: 'int'},
- {title: 'Double', value: 'double'},
- {title: 'Boolean', value: 'boolean'}
- ],
- allowInput: true,
- placeholder: '请选择'
- },
- {
- title: '下拉框_字典',
- key: 'select_dict',
- type: JVXETypes.select,
- width: '180px',
- options: [],
- dictCode: 'sex',
- placeholder: '请选择',
- },
- {
- title: '下拉框_多选',
- key: 'select_multiple',
- type: JVXETypes.selectMultiple,
- width: '205px',
- options: [
- {title: 'String', value: 'string'},
- {title: 'Integer', value: 'int'},
- {title: 'Double', value: 'double'},
- {title: 'Boolean', value: 'boolean'}
- ],
- defaultValue: ['int', 'boolean'], // 多个默认项
- // defaultValue: 'string,double,int', // 也可使用这种方式
- placeholder: '多选',
- },
- {
- title: '下拉框_搜索',
- key: 'select_search',
- type: JVXETypes.selectSearch,
- width: '180px',
- options: [
- {title: 'String', value: 'string'},
- {title: 'Integer', value: 'int'},
- {title: 'Double', value: 'double'},
- {title: 'Boolean', value: 'boolean'}
- ],
- },
- {
- title: '日期时间',
- key: 'datetime',
- type: JVXETypes.datetime,
- width: '200px',
- defaultValue: '2019-4-30 14:52:22',
- placeholder: '请选择',
- },
- {
- title: '复选框',
- key: 'checkbox',
- type: JVXETypes.checkbox,
- width: '100px',
- customValue: ['Y', 'N'], // true ,false
- defaultChecked: false,
- },
- {
- title: '操作',
- key: 'action',
- type: JVXETypes.slot,
- fixed: 'right',
- minWidth: '100px',
- align: 'center',
- slotName: 'action',
- }
- ],
- dataSource: [],
- }
- },
- created() {
- this.randomPage(0, 20, true)
- },
- methods: {
- handleCK(props) {
- this.$message.success('请在控制台查看输出')
- // 参数介绍:
- // props.value 当前单元格的值
- // props.row 当前行的数据
- // props.rowId 当前行ID
- // props.rowIndex 当前行下标
- // props.column 当前列的配置
- // props.columnIndex 当前列下标
- // props.$table vxe实例,可以调用vxe内置方法
- // props.target JVXE实例,可以调用JVXE内置方法
- // props.caseId JVXE实例唯一ID
- // props.scrolling 是否正在滚动
- // props.triggerChange 触发change事件,用于更改slot的值
- console.log('查看: ', {props})
- },
- handleDL(props) {
- // 调用删除方法
- props.target.removeRows(props.row)
- },
- handleValueChange(event) {
- console.log('handleValueChange.event: ', event)
- },
- /** 表单验证 */
- handleTableCheck() {
- this.$refs.vTable.validateTable().then(errMap => {
- if (errMap) {
- console.log('表单验证未通过:', {errMap})
- this.$message.error('验证未通过,请在控制台查看详细')
- } else {
- this.$message.success('验证通过')
- }
- })
- },
- /** 获取值,忽略表单验证 */
- handleTableGet() {
- const values = this.$refs.vTable.getTableData()
- console.log('获取值:', {values})
- this.$message.success('获取值成功,请看控制台输出')
- },
- /** 模拟加载1000条数据 */
- handleTableSet() {
- this.randomPage(1, 1000, true)
- },
- /* 随机生成数据 */
- randomPage(current, pageSize, loading = false) {
- if (loading) {
- this.loading = true
- }
- let randomDatetime = () => {
- let time = randomNumber(1000, 9999999999999)
- return moment(new Date(time)).format('YYYY-MM-DD HH:mm:ss')
- }
- let limit = (current - 1) * pageSize
- let options = ['string', 'int', 'double', 'boolean']
- let begin = Date.now()
- let values = []
- for (let i = 0; i < pageSize; i++) {
- values.push({
- id: randomUUID(),
- normal: `normal-${(limit + i) + 1}`,
- input: `text-${(limit + i) + 1}`,
- textarea: `textarea-${(limit + i) + 1}`,
- number: randomNumber(0, 233),
- select: options[randomNumber(0, 3)],
- select_dict: randomNumber(1, 2).toString(),
- select_multiple: (() => {
- let length = randomNumber(1, 4)
- let arr = []
- for (let j = 0; j < length; j++) {
- pushIfNotExist(arr, options[randomNumber(0, 3)])
- }
- return arr
- })(),
- select_search: options[randomNumber(0, 3)],
- datetime: randomDatetime(),
- checkbox: ['Y', 'N'][randomNumber(0, 1)]
- })
- }
- this.dataSource = values
- let end = Date.now()
- let diff = end - begin
- if (loading && diff < pageSize) {
- setTimeout(() => {
- this.loading = false
- }, pageSize - diff)
- }
- }
- }
- }
- </script>
- <style scoped>
- </style>
|