1.我的设计思路是当点击expand箭头后显示出来内容,然后双击(单击也可以,根据自己想法来)某个区域,然后弹窗进行数据修改,然后双向绑定进行数据渲染,点击保存按钮后数据传输到后台进行数据修改
2.看下效果图
3.然后双击其中的字段进行弹窗,然后进行值的修改
点击确定后,将数据渲染到页面上,然后点击保存按钮进行后端交互
4.下面是具体的代码,首先给expand里的参数添加点击事件
<el-table-column type="expand"> <template slot-scope="props"> <el-form label-position="left" inline class="demo-table-expand" style="background-color:pink" > <el-form-item label="项目名称:"> <span @dblclick=" updateInfo( '项目名称', 'name', props.$index, props.row.name, 'plainInput' ) " >{{ props.row.name }}</span > </el-form-item> <el-form-item label="项目版本:"> <span @dblclick=" updateInfo( '项目版本', 'version', props.$index, props.row.version, 'plainInput' ) " >{{ props.row.version }}</span > </el-form-item> <el-form-item label="运行状态:"> <span @dblclick=" updateInfo( '运行状态', 'runStatus', props.$index, props.row.runStatus, 'select' ) " >{{ props.row.runStatus }}</span > </el-form-item> <el-form-item label="开发状态:"> <span @dblclick=" updateInfo( '开发状态', 'devStatus', props.$index, props.row.devStatus, 'select' ) " >{{ props.row.devStatus }}</span > </el-form-item> <el-form-item label="需 求 方 :"> <span @dblclick=" updateInfo( '需 求 方', 'demand', props.$index, props.row.demand, 'plainInput' ) " >{{ props.row.demand }}</span > </el-form-item> <el-form-item label="项目类型:"> <span @dblclick=" updateInfo( '项目类型', 'type', props.$index, props.row.type, 'select' ) " >{{ props.row.type }}</span > </el-form-item> <el-form-item label="推 送 人 :"> <span @dblclick=" updateInfo( '推 送 人', 'pusher', props.$index, props.row.pusher, 'select' ) " >{{ props.row.pusher }}</span > </el-form-item> <el-form-item label="负 责 人 :"> <span @dblclick=" updateInfo( '负 责 人', 'principal', props.$index, props.row.principal, 'plainInput' ) " >{{ props.row.principal }}</span > </el-form-item> <el-form-item label="计划开始时间:"> <span @dblclick=" updateInfo( '计划开始时间', 'planStartTime', props.$index, props.row.planStartTime, 'timePicker' ) " >{{ props.row.planStartTime }}</span > </el-form-item> <el-form-item label="计划结束时间:"> <span @dblclick=" updateInfo( '计划结束时间', 'planEndTime', props.$index, props.row.planEndTime, 'timePicker ' ) " >{{ props.row.planEndTime }}</span > </el-form-item> <el-form-item label="创建时间:"> <span>{{ props.row.createTime }}</span> </el-form-item> <el-form-item label="最后修改时间:"> <span>{{ props.row.updateTime }}</span> </el-form-item> <el-form-item label="项目描述:"> <span @dblclick=" updateInfo( '项目描述', 'description', props.$index, props.row.description, 'textArea' ) " >{{ props.row.description }}</span > </el-form-item> <el-form-item label=""> <el-button type="primary" @click="savePane(props)" size="mini" >保存</el-button > </el-form-item> </el-form> </template> </el-table-column>5.下面是对应的参数初始化,和点击事件方法
data() { return { ... updateDialog: false, updateDialogFieldCn: "", // 要修改的属性名-中文 updateDialogFieldEn: "", // 要修改的属性名-英文 updateDialogDefaultValue: "", // 修改弹窗中默认的值 updateDialogFieldType: "", // 弹窗中组件的类型 updateDialogRowIndex: 0 // 修改的值所在的行索引 }; },6.弹窗的部分代码,主要通过updateDialogFieldType进行区分
<!-- 双击属性事件的弹窗 --> <el-dialog :title="'修改' + updateDialogFieldCn" :visible.sync="updateDialog" > <el-form v-if="updateDialogFieldType=== 'plainInput'"> <el-form-item :label="updateDialogFieldCn" label-width="120px"> <el-input v-model="updateDialogDefaultValue"></el-input> </el-form-item> .... 后面为updateDialogFieldType='select',updateDialogFieldType='timePicker'等其他的布局 </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="updateDialog = false">取 消</el-button> <el-button type="primary" @click="saveUpdateDialog">确 定</el-button> </div> </el-dialog>7.双击expand中属性值触发的事件
// 定义pane中部件的点击事件 updateInfo(cn, en, index, originValue, type) { // cn:要修改的属性值中文名,作为弹窗表单中组件的label和弹窗的title // en:要修改的属性值英文名,用在点击保存后给对象的某个属性设值的时候用 // index:为修改的值所在tabData的行索引,用来进行值修改 // originValue为该字段对应的原始默认值,用来进行渲染 // type为弹窗中的组件类型,plainInput,select,timePicker,textArea等,根据需求名字自己定 this.updateDialog = true; this.updateDialogFieldCn = cn; this.updateDialogFieldEn = en; this.updateDialogRowIndex = index; this.updateDialogDefaultValue = originValue; this.updateDialogFieldType = type; },8.然后是弹窗确定按钮的点击事件
// 修改弹窗的确定按钮的点击事件 saveUpdateDialog() { this.updateDialog = false; let obj = this.tableData[this.updateDialogRowIndex]; // 获取tableData中该行的对象 obj[this.updateDialogFieldEn] = this.updateDialogDefaultValue; // 修改该对象中指定属性的值 // 属性值还原初始化 (this.updateDialogFieldCn = ""), // 要修改的属性名-中文 (this.updateDialogFieldEn = ""), // 要修改的属性名-英文 (this.updateDialogFieldType = ""), // 弹窗中组件的类型 (this.updateDialogFieldType = 1), // 弹窗中组件的类型 (this.updateDialogRowIndex = 0); // 修改的值所在的索引 },
