element表格弹窗编辑--实时更新(深浅拷贝)

80 阅读1分钟
  <el-table   height="600" width="100%"            :header-cell-style="{ background: '#FAFAFA',color: '#8C8C8C' }" show-overflow  :loading="loading" :data="tableData" class="first-table">                <el-table-column prop="name" label="档案项"></el-table-column>                <el-table-column prop="value_item" label="值类型"></el-table-column>                <el-table-column label="操作" width="300" align="center"  fixed="right">                    <template #default="{ row }">                        <el-button @click="handleAction('edit', row)" type="text">编辑</el-button>                        <el-button @click="handleAction('del', row)" type="text">删除</el-button>                    </template>                </el-table-column>            </el-table>

这个是表格数据

  <el-dialog :visible.sync="editVisible" :title="isEdit ? '编辑档案项' : '新建档案项'">            <div class="edit-dialog">                <el-form  :model="formData"  :rules="rules" ref="formData" :label-width="formLabelWidth">                    <el-form-item label="名称:" >                        <el-input v-model="formData.name"></el-input>                    </el-form-item>                    <el-form-item label="值类型:" >                        <el-select v-model="formData.value" placeholder="请选择值类型" :disabled="isEdit">                            <el-option v-for="(item, index) in valueList" :key="index" :value="item"></el-option>                        </el-select>                    </el-form-item>                </el-form>                <div slot="footer" class="dialog-footer">                    <el-button @click="handleAction('cancel')">取 消</el-button>                    <el-button type="primary" @click="handleSave('formData')">保存</el-button>                </div>            </div>        </el-dialog>

这个是弹窗

 // this.formData = data
用上面这句话会实现弹窗里的name值改变,表格里的数据直接跟着变化;             

js赋值

原理是:这个data 是个数组或者对象,引用型变量, 从而导致双向绑定。

换句话说,当你改变 this.formData 中的数据时,data 中对应的数据也会随之改变,反之亦然。因为它们实际上指向相同的内存地址。

避免双向绑定(用浅拷贝)

如果你希望避免这种双向绑定的行为,可以使用一些方法来创建 formData 的副本,而不是直接将其赋值给 data。例如,可以使用 Object.assign() 方法或 ES6 的展开运算符 ... 来创建 formData 的副本,而不影响原始的 data 数据

 this.formData = Object.assign({}, data);                    // 使用展开运算符创建副本      
 this.formData = { ...data };
这个是弹窗里面变化,表格内数据不变化,等点击保存在刷新列表改变数据;