Files
vxe-table/examples/views/table/edit/PopupForm.vue
xuliangzhan c43dc3ccd9 更新文档
2020-02-12 14:36:25 +08:00

302 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div>
<p class="tip">实现弹框表单编辑功能双击行可以弹出编辑框</p>
<vxe-table
border
resizable
row-key
highlight-hover-row
ref="xTable"
height="500"
:data="tableData"
@cell-dblclick="cellDBLClickEvent">
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name"></vxe-table-column>
<vxe-table-column field="sex" title="Sex" :formatter="formatterSex"></vxe-table-column>
<vxe-table-column field="age" title="Age"></vxe-table-column>
<vxe-table-column field="address" title="Address" show-overflow></vxe-table-column>
<vxe-table-column title="操作" width="100" show-overflow>
<template v-slot="{ row }">
<vxe-button type="text" icon="fa fa-edit" @click="editEvent(row)"></vxe-button>
<vxe-button type="text" icon="fa fa-trash-o" @click="removeEvent(row)"></vxe-button>
</template>
</vxe-table-column>
</vxe-table>
<vxe-modal ref="xModal" v-model="showEdit" title="编辑&保存" width="800" :loading="submitLoading" resize destroy-on-close>
<vxe-form :data="formData" :rules="formRules" title-align="right" title-width="100" @submit="submitEvent">
<vxe-form-item title="Basic information" span="24" title-align="left" title-width="200px" :title-prefix="{icon: 'fa fa-address-card-o'}"></vxe-form-item>
<vxe-form-item title="Name" field="name" span="12" :item-render="{name: 'input', attrs: {placeholder: '请输入名称'}}"></vxe-form-item>
<vxe-form-item title="Nickname" field="nickname" span="12" :item-render="{name: 'input', attrs: {placeholder: '请输入昵称'}}"></vxe-form-item>
<vxe-form-item title="Role" field="role" span="12" :item-render="{name: 'input', attrs: {placeholder: '请输入角色'}}"></vxe-form-item>
<vxe-form-item title="Sex" field="sex" span="12" :item-render="{name: 'select', options: sexList}"></vxe-form-item>
<vxe-form-item title="Age" field="age" span="12" :item-render="{name: 'input', attrs: {type: 'number', placeholder: '请输入年龄'}}"></vxe-form-item>
<vxe-form-item title="是否单身" field="flag1" span="12">
<vxe-radio v-model="formData.flag1" name="single" label="Y"></vxe-radio>
<vxe-radio v-model="formData.flag1" name="single" label="N"></vxe-radio>
</vxe-form-item>
<vxe-form-item title="可选信息" field="checkedList" span="24">
<vxe-checkbox-group v-model="formData.checkedList">
<vxe-checkbox label="1">运动跑步</vxe-checkbox>
<vxe-checkbox label="2">听音乐</vxe-checkbox>
<vxe-checkbox label="3">泡妞</vxe-checkbox>
<vxe-checkbox label="4">吃美食</vxe-checkbox>
</vxe-checkbox-group>
</vxe-form-item>
<vxe-form-item title="Other information" span="24" title-align="left" title-width="200px" :title-prefix="{message: '请填写必填项', icon: 'fa fa-info-circle'}"></vxe-form-item>
<vxe-form-item title="Number" field="num" span="12" :item-render="{name: 'input', attrs: {type: 'number', placeholder: '请输入数值'}}"></vxe-form-item>
<vxe-form-item title="Date" field="date3" span="12" :item-render="{name: 'input', attrs: {type: 'date', placeholder: '请选择日期'}}"></vxe-form-item>
<vxe-form-item title="Address" field="address" span="24" :title-suffix="{message: '啦啦啦就是这么强大', icon: 'fa fa-question-circle'}" :item-render="{name: 'textarea', attrs: {placeholder: '请输入地址'}}"></vxe-form-item>
<vxe-form-item align="center" span="24">
<vxe-button type="submit" status="primary">保存</vxe-button>
<vxe-button type="reset">重置</vxe-button>
<vxe-button @click="$refs.xModal.close()">取消</vxe-button>
</vxe-form-item>
</vxe-form>
</vxe-modal>
<p class="demo-code">{{ $t('app.body.button.showCode') }}</p>
<pre>
<code class="xml">{{ demoCodes[0] }}</code>
<code class="javascript">{{ demoCodes[1] }}</code>
</pre>
</div>
</template>
<script>
import hljs from 'highlight.js'
export default {
data () {
return {
submitLoading: false,
tableData: [],
selectRow: null,
showEdit: false,
sexList: [
{ label: '', value: '' },
{ label: '女', value: '0' },
{ label: '男', value: '1' }
],
formData: {
name: null,
nickname: null,
role: null,
sex: null,
age: null,
num: null,
checkedList: [],
flag1: null,
date3: null,
address: null
},
formRules: {
name: [
{ required: true, message: '请输入名称' },
{ min: 3, max: 5, message: '长度在 3 到 5 个字符' }
],
nickname: [
{ required: true, message: '请输入昵称' }
],
sex: [
{ required: true, message: '请选择性别' }
]
},
demoCodes: [
`
<vxe-table
border
resizable
row-key
highlight-hover-row
ref="xTable"
height="500"
:data="tableData"
@cell-dblclick="cellDBLClickEvent">
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name"></vxe-table-column>
<vxe-table-column field="sex" title="Sex" :formatter="formatterSex"></vxe-table-column>
<vxe-table-column field="age" title="Age"></vxe-table-column>
<vxe-table-column field="address" title="Address" show-overflow></vxe-table-column>
<vxe-table-column title="操作" width="100" show-overflow>
<template v-slot="{ row }">
<vxe-button type="text" icon="fa fa-edit" @click="editEvent(row)"></vxe-button>
<vxe-button type="text" icon="fa fa-trash-o" @click="removeEvent(row)"></vxe-button>
</template>
</vxe-table-column>
</vxe-table>
<vxe-modal ref="xModal" v-model="showEdit" title="编辑&保存" width="800" :loading="submitLoading" resize destroy-on-close>
<vxe-form :data="formData" :rules="formRules" title-align="right" title-width="100" @submit="submitEvent">
<vxe-form-item title="Basic information" span="24" title-align="left" title-width="200px" :title-prefix="{icon: 'fa fa-address-card-o'}"></vxe-form-item>
<vxe-form-item title="Name" field="name" span="12" :item-render="{name: 'input', attrs: {placeholder: '请输入名称'}}"></vxe-form-item>
<vxe-form-item title="Nickname" field="nickname" span="12" :item-render="{name: 'input', attrs: {placeholder: '请输入昵称'}}"></vxe-form-item>
<vxe-form-item title="Role" field="role" span="12" :item-render="{name: 'input', attrs: {placeholder: '请输入角色'}}"></vxe-form-item>
<vxe-form-item title="Sex" field="sex" span="12" :item-render="{name: 'select', options: sexList}"></vxe-form-item>
<vxe-form-item title="Age" field="age" span="12" :item-render="{name: 'input', attrs: {type: 'number', placeholder: '请输入年龄'}}"></vxe-form-item>
<vxe-form-item title="是否单身" field="flag1" span="12">
<vxe-radio v-model="formData.flag1" name="single" label="Y">是</vxe-radio>
<vxe-radio v-model="formData.flag1" name="single" label="N">否</vxe-radio>
</vxe-form-item>
<vxe-form-item title="可选信息" field="checkedList" span="24">
<vxe-checkbox-group v-model="formData.checkedList">
<vxe-checkbox label="1">运动、跑步</vxe-checkbox>
<vxe-checkbox label="2">听音乐</vxe-checkbox>
<vxe-checkbox label="3">泡妞</vxe-checkbox>
<vxe-checkbox label="4">吃美食</vxe-checkbox>
</vxe-checkbox-group>
</vxe-form-item>
<vxe-form-item title="Other information" span="24" title-align="left" title-width="200px" :title-prefix="{message: '请填写必填项', icon: 'fa fa-info-circle'}"></vxe-form-item>
<vxe-form-item title="Number" field="num" span="12" :item-render="{name: 'input', attrs: {type: 'number', placeholder: '请输入数值'}}"></vxe-form-item>
<vxe-form-item title="Date" field="date3" span="12" :item-render="{name: 'input', attrs: {type: 'date', placeholder: '请选择日期'}}"></vxe-form-item>
<vxe-form-item title="Address" field="address" span="24" :title-suffix="{message: '啦啦啦,就是这么强大!!!', icon: 'fa fa-question-circle'}" :item-render="{name: 'textarea', attrs: {placeholder: '请输入地址'}}"></vxe-form-item>
<vxe-form-item align="center" span="24">
<vxe-button type="submit" status="primary">保存</vxe-button>
<vxe-button type="reset">重置</vxe-button>
<vxe-button @click="$refs.xModal.close()">取消</vxe-button>
</vxe-form-item>
</vxe-form>
</vxe-modal>
`,
`
export default {
data () {
return {
submitLoading: false,
tableData: [],
selectRow: null,
showEdit: false,
sexList: [
{ label: '', value: '' },
{ label: '女', value: '0' },
{ label: '男', value: '1' }
],
formData: {
name: null,
nickname: null,
role: null,
sex: null,
age: null,
num: null,
checkedList: [],
flag1: null,
date3: null,
address: null
},
formRules: {
name: [
{ required: true, message: '请输入名称' },
{ min: 3, max: 5, message: '长度在 3 到 5 个字符' }
],
nickname: [
{ required: true, message: '请输入昵称' }
],
sex: [
{ required: true, message: '请选择性别' }
]
}
}
},
created () {
this.tableData = window.MOCK_DATA_LIST.slice(0, 20)
},
methods: {
formatterSex ({ cellValue }) {
let item = this.sexList.find(item => item.value === cellValue)
return item ? item.label : ''
},
cellDBLClickEvent ({ row }) {
this.editEvent(row)
},
editEvent (row) {
this.formData = {
name: row.name,
nickname: row.nickname,
role: row.role,
sex: row.sex,
age: row.age,
num: row.num,
checkedList: row.checkedList,
flag1: row.flag1,
date3: row.date3,
address: row.address
}
this.selectRow = row
this.showEdit = true
},
removeEvent (row) {
this.$XModal.confirm('您确定要删除该数据?').then(type => {
if (type === 'confirm') {
this.$refs.xTable.remove(row)
}
})
},
submitEvent () {
this.submitLoading = true
setTimeout(() => {
this.submitLoading = false
this.showEdit = false
this.$XModal.message({ message: '保存成功', status: 'success' })
Object.assign(this.selectRow, this.formData)
}, 500)
}
}
}
`
]
}
},
created () {
this.tableData = window.MOCK_DATA_LIST.slice(0, 20)
},
mounted () {
Array.from(this.$el.querySelectorAll('pre code')).forEach((block) => {
hljs.highlightBlock(block)
})
},
methods: {
formatterSex ({ cellValue }) {
let item = this.sexList.find(item => item.value === cellValue)
return item ? item.label : ''
},
cellDBLClickEvent ({ row }) {
this.editEvent(row)
},
editEvent (row) {
this.formData = {
name: row.name,
nickname: row.nickname,
role: row.role,
sex: row.sex,
age: row.age,
num: row.num,
checkedList: row.checkedList,
flag1: row.flag1,
date3: row.date3,
address: row.address
}
this.selectRow = row
this.showEdit = true
},
removeEvent (row) {
this.$XModal.confirm('您确定要删除该数据?').then(type => {
if (type === 'confirm') {
this.$refs.xTable.remove(row)
}
})
},
submitEvent () {
this.submitLoading = true
setTimeout(() => {
this.submitLoading = false
this.showEdit = false
this.$XModal.message({ message: '保存成功', status: 'success' })
Object.assign(this.selectRow, this.formData)
}, 500)
}
}
}
</script>