修改表格

This commit is contained in:
zouzhibing 2022-05-18 18:07:29 +08:00
parent f30a6d298a
commit 8c256aafcb
4 changed files with 237 additions and 193 deletions

View File

@ -25,7 +25,12 @@ const tableRouter = {
name: 'inline-table',
meta: { title: '行内编辑', noCache: true }
},
{
path: 'edit-table',
component: () => import('@/views/table/edit.vue'),
name: 'edit-table',
meta: { title: '可编辑表格', noCache: true }
},
]
}

View File

@ -5,12 +5,12 @@ import { parseTime } from './uniele'
*/
export function formatDate(cellValue) {
if (cellValue == null || cellValue == "") return "";
var date = new Date(cellValue)
var date = new Date(cellValue)
var year = date.getFullYear()
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
}
@ -330,7 +330,7 @@ export function makeMap(str, expectsLowerCase) {
? val => map[val.toLowerCase()]
: val => map[val]
}
export const exportDefault = 'export default '
export const beautifierConf = {
@ -387,4 +387,28 @@ export function camelCase(str) {
export function isNumberStr(str) {
return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
}
// // 深度克隆 array 数组或 json 对象,返回克隆后的副本
export const deepObjClone = function(obj){
let weakMap = new WeakMap()
function clone (obj){
if(obj==null){return obj}
if(obj instanceof Date){ return new Date(obj) }
if(obj instanceof RegExp){ return new RegExp(obj)}
if(typeof obj !== 'object') return obj
if(weakMap.get(obj)){
return weakMap.get(obj)
}
var copy = new obj.constructor
weakMap.set(obj,copy)
for(var key in obj){
if(Object.prototype.hasOwnProperty.call(obj, key)){
var value = obj[key];
copy[key] = clone(value);
}
}
return copy;
}
return clone (obj)
};

View File

@ -5,7 +5,7 @@
<el-icon style="margin-right: 4px"><plus /></el-icon> </el-button>
</div>
<el-table :data="transData" style="width: 100%" row-key="id" border>
<template v-for="item in columns" >
<template v-for="item,index in columns" >
<el-table-column v-if="item.type" :type="item.type" :width="item.width" :align="item.align" :fixed="item.fixed" :label="item.label"/>
<el-table-column
v-else
@ -68,35 +68,33 @@
type="primary"
size="small"
icon="Edit"
@click="scope.row.edit=!scope.row.edit"
@click="edit(scope.row)"
>
编辑
</el-button>
<el-popover
trigger="click"
v-model:visible="scope.row.visible" placement="top" :width="160">
placement="top"
width="160"
v-model="scope.row.visible">
<p style="display: flex;align-items: center;margin-bottom: 10px">
<el-icon color="#faad14" style="margin-right: 10px"><warning-filled /></el-icon> </p>
<i class="el-icon-warning" style="margin-right: 10px;color: #faad14"></i>
删除此行</p>
<div style="text-align: right; margin: 0">
<el-button size="small" @click="scope.row.visible = false"
<el-button size="small" @click.stop="cancelVisible(scope.row)"
>取消</el-button
>
<el-button size="small" type="primary" @click="deleteAction(scope.row)"
<el-button size="small" type="primary" @click.stop="deleteConfigAction(scope.row)"
>确定</el-button
>
</div>
<template #reference>
<el-button
icon="Delete"
@click="scope.row.visible = true" type="danger" size="small">删除</el-button>
</template>
<el-button slot="reference" @click.stop="deleteAction(scope.row)" type="danger" size="small">删除</el-button>
</el-popover>
<el-button
v-if="scope.row.edit"
type="primary"
size="small"
icon="Edit"
@click="cancelEdit(scope.row)"
@click.stop="cancelEdit(scope.row)"
>
取消
</el-button>
@ -109,160 +107,167 @@
</div>
</div>
</template>
<script lang="ts" setup>
import {computed, onMounted, ref, watch} from "vue";
import {deepObjClone} from '@/utils/index'
import { ElMessage,ElMessageBox } from 'element-plus'
import { reactive } from 'vue'
const emit = defineEmits(['del','add','onChange'])
let transData = ref([])
let props = defineProps({
columns:{
type:Array,
default:()=>[]
<script>
import {deepObjClone} from '@/utils/index'
export default {
props:{
columns:{
type:Array,
default:()=>[]
},
data:{
type:Array,
default:()=>[]
},
editableKeys:{
type:Array,
default:()=>[]
},
mode:{
type:String,
default:'bottom'
}
},
data:{
type:Array,
default:()=>[]
},
editableKeys:{
type:Array,
default:()=>[]
},
mode:{
type:String,
default:'bottom'
}
})
const getData = ()=>{
let arr = deepObjClone(transData.value)
for(let item of arr){
for(let attr in item){
if(attr.includes('te__mp')){
delete item[attr]
data(){
return{
obj:{},
transData:[],
visible:false,
listLoading:false,
formInline:{
user: '',
region: '',
}
}
}
emit('onChange',arr)
}
let obj={}
for(let item of props.columns){
props.data.forEach(it=>{
if(!obj[item.name]){
obj[item.name] = null
}
})
}
const reset = ()=>{
transData.value = props.data
getData()
}
onMounted(()=>{
watch(()=>props.data,(val)=>{
// //
transData.value = deepObjClone(val)
//
for(let item of transData.value){
if(props.editableKeys.includes(item.id)){
item.edit = true
},
watch:{
'data':{
handler(val){
let arr = deepObjClone(val)
//
for(let item of arr){
if(this.editableKeys.includes(item.id)){
item.edit = true
}
for(let attr in item){
let temp = `${attr}te__mp`
item[temp] = item[attr]
}
}
// //
this.transData = arr
for(let attr in item){
let temp = `${attr}te__mp`
item[temp] = item[attr]
}
},
deep:true,
immediate:true
}
// console.log('transData',transData)
},{
immediate:true,
deep:true
})
},
created(){
})
const visible = ref(false)
const handleSizeChange = (val: number) => {
console.log(`${val} items per page`)
}
const listLoading = ref(false)
//
const confirmEdit = (row)=>{
row.edit = false
for(let attr in row){
if(attr.includes('te__mp')){
row[(attr)] = row[(attr.replace('te__mp',''))]
let obj={}
for(let item of this.columns){
this.data.forEach(it=>{
if(!obj[item.name]){
obj[item.name] = null
}
})
}
}
getData()
}
//
const cancelEdit = (row)=>{
row.edit=!row.edit
for(let attr in row){
if(!attr.includes('te__mp')){
row[attr] = row[(attr+'te__mp')]
this.obj = obj
},
methods:{
cancelVisible(row){
this.$set(row,'visible',false)
},
getData(){
let arr = deepObjClone(this.transData)
for(let item of arr){
for(let attr in item){
if(attr.includes('te__mp')){
delete item[attr]
}
}
}
this.$emit('onChange',arr)
},
reset(){
this.transData = this.data
this.getData()
},
handleSizeChange(val){
console.log(`${val} items per page`)
},
//
confirmEdit(row){
this.$set(row,'edit',false)
for(let attr in row){
if(attr.includes('te__mp')){
row[(attr)] = row[(attr.replace('te__mp',''))]
}
}
this.getData()
},
//
cancelEdit (row){
this.$set(row,'edit',false)
for(let attr in row){
if(!attr.includes('te__mp')){
if(attr!=='edit'){
row[attr] = row[(attr+'te__mp')]
}
}
}
},
edit(row){
this.$set(row,'edit',!row.edit)
},
deleteProver(row){
row.visible = true
this.$set(row,'visible',true)
let obj1 = Object.assign({},row)
obj1.visible = true
},
deleteConfigAction(row){
this.$set(row,'visible',false)
this.transData = this.transData.filter((item)=>item.id!==row.id)
this.$emit('del',row)
},
deleteAction (row){
},
add(){
let id = ~~(Math.random() * 1000000).toFixed(0)
let obj1 = Object.assign({},this.obj,{
id:id,
edit:true,
visible:false,
})
for(let attr in obj1){
let temp = `${attr}te__mp`
obj1[temp] = obj1[attr]
}
if(this.mode==='bottom'){
this.transData.push(obj1)
}
if(this.mode==='top'){
this.transData.unshift(obj1)
}
},
filterOption(item,scope){
let obj = item.options.find(ite=>ite.value===scope.row[item.name])
if(obj){
return obj.label
}
return '--'
}
}
}
const formInline = reactive({
user: '',
region: '',
})
const onSubmit = () => {
console.log('submit!')
}
const deleteAction = (row)=>{
row.visible = false
transData.value = transData.value.filter((item)=>item.id!==row.id)
emit('del',row)
}
const add = ()=>{
let id = ~~(Math.random() * 1000000).toFixed(0)
let obj1 = Object.assign({},obj,{
id:id,
edit:true,
visible:false,
})
for(let attr in obj1){
let temp = `${attr}te__mp`
obj1[temp] = obj1[attr]
}
if(props.mode==='bottom'){
transData.value.push(obj1)
}
if(props.mode==='top'){
transData.value.unshift(obj1)
}
}
const filterOption = (item,scope)=>{
let obj = item.options.find(ite=>ite.value===scope.row[item.name])
if(obj){
return obj.label
}
return '--'
}
defineExpose({
reset
})
</script>
<style scoped>
.edit-input {

View File

@ -1,5 +1,5 @@
<template>
<div>
<div class="app-container">
<div style="display: flex;justify-content: flex-end">
<el-radio-group v-model="radio">
<el-radio label="top">添加到顶部</el-radio>
@ -26,11 +26,8 @@
</div>
</template>
<script lang="ts" setup>
<script >
import EditTable from './components/edit.vue'
import { ElMessage,ElMessageBox } from 'element-plus'
import {ref} from "vue";
const table = ref()
const column = [
{ name: 'title',
label: '活动名称',
@ -84,7 +81,7 @@
update_at: '2020-05-27T08:19:22Z',
},
{
id: 624291229,
id: 6242922222,
title: '活动名称三',
readonly: '活动名称三',
decs: '这个活动真好玩',
@ -93,7 +90,7 @@
update_at: '2020-05-27T08:19:22Z',
},
{
id: 624291229,
id: 62425491229,
title: '活动名称四',
readonly: '活动名称四',
decs: '这个活动真好玩',
@ -102,7 +99,7 @@
update_at: '2020-05-27T08:19:22Z',
},
{
id: 624291229,
id: 62429281229,
title: '活动名称五',
readonly: '活动名称五',
decs: '这个活动真好玩',
@ -111,7 +108,7 @@
update_at: '2020-05-27T08:19:22Z',
},
{
id: 624291229,
id: 62429091229,
title: '活动名称六',
readonly: '活动名称六',
decs: '这个活动真好玩',
@ -120,7 +117,7 @@
update_at: '2020-05-27T08:19:22Z',
},
{
id: 624291229,
id: 62421191229,
title: '活动名称七',
readonly: '活动名称五',
decs: '这个活动真好玩',
@ -129,7 +126,7 @@
update_at: '2020-05-27T08:19:22Z',
},
{
id: 624291229,
id: 6242222291229,
title: '活动名称八',
readonly: '活动名称六',
decs: '这个活动真好玩',
@ -138,31 +135,44 @@
update_at: '2020-05-27T08:19:22Z',
},
]
export default {
components:{
EditTable
},
data(){
return{
dataSource:data,
column,
list:data,
radio:'bottom',
editableKeys:[]
}
},
created(){
let arrKeys = data.filter(item=>![624748504,624691229].includes(item.id)).map(item=>item.id)
this.editableKeys = arrKeys
},
methods:{
deleteAction(row){
console.log('删除',row)
this.$message.success('点击删除')
},
onChange(val){
this.dataSource = val
},
add(){
let arrKeys = data.map(item=>item.id)
const radio = ref('bottom')
const list = ref(data)
let editableKeys = ref(arrKeys)
const dataSource = ref(data)
const deleteAction = (row)=>{
console.log('删除',row)
ElMessage.success('点击删除')
}
const onChange = (val)=>{
dataSource.value = val
}
const add = (row)=>{
}
const reset = (val)=>{
ElMessage.success('重置成功')
table.value.reset()
}
const config = ()=>{
list.value = dataSource.value
console.log('点击提交=========',dataSource.value)
ElMessage.success('点击提交数据')
},
reset(val){
this.$message.success('重置成功')
this.$refs.table.reset()
},
config(){
this.list = this.dataSource
console.log('点击提交=========',this.dataSource)
this.$message.success('点击提交数据')
}
}
}
</script>