vue双向绑定造成的el-table行数据的问题

本文探讨了在Vue项目中使用双向绑定时遇到的一个常见问题:弹窗表单数据意外覆盖表格显示数据的现象。通过调整代码逻辑和数据绑定方式,成功解决了这一问题。

el-table-column中定义了如下代码,

<el-table-column label="支付编码" align="center" prop="payCode" :show-overflow-tooltip="true" />
<el-table-column label="支付方式" align="center" prop="payType" :show-overflow-tooltip="true" />

然后定义了一个弹窗,用来新增、修改记录,prop的命名跟表格的prop命名一样

<el-dialog :title="title" :visible.sync="open" width="500px">
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
        <el-form-item label="支付编码" prop="payCode">
          <el-input v-model="form.payCode" placeholder="请输入" />
        </el-form-item>
        <el-form-item label="支付方式" prop="payType">
          <el-input v-model="form.payType" placeholder="请输入" />
        </el-form-item>
        <el-form-item label="是否启用" prop="ifUse">
           <el-radio v-model="form.ifUse" label="1">启用</el-radio>
           <el-radio v-model="form.ifUse" label="0">关闭</el-radio>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
</el-dialog>

界面如图

点第一条的修改,弹窗,然后点取消

再点第二条的修改,然后点取消

这时神奇的事情发生了

第二条的记录也变成第一条的数据了,为啥form的prop会赋值到table里的prop去呢?

如果修改el-form-item的prop的命名跟表格的prop命名不一样的话就不会出现这个问题

一直以为是el-table的问题,后来查询了一下,原来是因为vue的双向绑定问题,

最终解决方案如下:

handleUpdate(row) { 
      this.reset();      
      this.form = JSON.parse(JSON.stringify(row));
      this.open = true;
      this.title = "修改支付方式";         
}

或者修改代码,改成这样赋值,不会出现这个问题

   handleUpdate(row) { 
      this.reset();      
      
      this.form.id = row.id;
      this.form.payCode = row.payCode;
      this.form.payType = row.payType;
      this.form.ifUse = row.ifUse;   
      this.open = true;
      this.title = "修改支付方式";  
        
  }

 

 

<think>首先,用户的问题是关于在Vue2中调整Element UI的el-table组件中每行数据的高度。用户指定了使用Vue2和Element UI,所以我的回答需要基于这个框架。 回顾系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题- 回答中引用的段落末尾自然地添加引用标识。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题- 保证回答真实可靠。 参考站内引用: - 引用[1]:修改表格样式,使用/deep/来覆盖el-table的td和th样式。 - 引用[2]:使用:header-cell-style和:cell-style属性来设置样式。 - 引用[3]:关于el-table不显示的问题,但这不是直接相关的。 用户真正的需求是修改el-table的行高。行高通常指的是每行数据的高度,即表格行的高度。 在Element UI的el-table中,修改行高可以通过CSS样式来实现。常见的方法包括: 1. 使用全局样式或scoped样式来覆盖默认样式。 2. 使用el-table提供的属性如:row-style或:cell-style。 具体步骤: - 行高可以通过设置.el-table__row或.el-table td的高度来调整。 -Vue2中,由于样式作用域问题,可能需要使用/deep/或>>>来穿透作用域。 参考引用: - 引用[1]提到使用/deep/ .el-table td, .building-top .el-table th.is-leaf来修改边框。 - 引用[2]提到使用:cell-style来设置单元格样式。 所以,我可以建议以下方法: 1. 使用CSS样式覆盖:在组件的<style scoped>中使用/deep/来修改行高。 2. 使用:row-style属性:el-table有一个row-style属性,可以设置行的样式。 例如: - 使用CSS:.el-table .el-table__row { height: 50px; } 但可能需要/deep/来穿透作用域。 - 使用row-style::row-style="{ height: '50px' }" 在Vue2中,由于scoped CSS,需要使用/deep/或::v-deep来穿透。 标准做法: - 在组件的<style scoped>部分: ```css /deep/ .el-table .el-table__row { height: 50px; } ``` - 或者使用:row-style属性: ```html <el-table :data="tableData" :row-style="{ height: '50px' }"> ... </el-table> ``` 但需要注意:row-style属性可能不是直接设置高度;它接受一个函数或对象来返回样式对象。在Element UI文档中,row-style用于设置行的样式,可以包括height。 Element UI官方文档: - row-style属性:Function({row, rowIndex})/Object,返回样式对象,如{ height: '50px' }。 - 类似地,cell-style用于单元格。 为了修改行高,设置height属性应该有效。 完整回答结构: 1. **介绍问题**:解释如何在Vue2中修改el-table的行高。 2. **提供方法**: - 方法1:使用CSS样式覆盖(推荐用于全局或简单修改)。 - 方法2:使用row-style属性(更动态)。 3. **示例代码**:给出Vue组件中的代码示例。 4. **注意事项**:提到作用域问题和兼容性。 5. **生成相关问题**:在末尾添加相关问题。 确保回答真实可靠:基于Element UI文档和常见实践。 相关问题生成: - 基于主题,如其他样式修改、性能影响等。 - 例如: 1. 如何修改el-table的表头高度? 2. 在Vue2中如何使用scoped CSS正确覆盖Element UI样式? 3. el-table有哪些其他自定义样式的属性? 最后,添加引用标识:在回答中如果引用站内引用,末尾添加[^1]等。但用户提供的引用是关于样式修改的,我可以自然地引用它们。 例如,在讨论方法时,可以说:如引用[1]所示,使用/deep/可以覆盖样式。 现在,构建回答。</think>### Vue2 中修改 Element UI el-table 行高的方法 在 Vue2 项目中调整 Element UI 的 `el-table` 组件行高(即每行数据的高度),主要涉及 CSS 样式覆盖或使用组件属性。以下是详细步骤和示例,确保结构清晰、真实可靠。 --- #### 方法 1:使用 CSS 样式覆盖(推荐) 通过 Vue 组件的 `<style scoped>` 部分,结合 `/deep/` 穿透作用域,直接修改行高。 **步骤**: 1. 在组件的样式部分,定位 `.el-table__row` 类(控制行元素)。 2. 设置 `height` 属性调整行高,同时可添加 `line-height` 确保内容垂直居中。 3. 使用 `/deep/` 解决 scoped CSS 作用域问题Vue2 支持)。 **示例代码**: ```vue <template> <el-table :data="tableData"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> </el-table> </template> <style scoped> /* 使用 /deep/ 覆盖 el-table 行高 */ /deep/ .el-table .el-table__row { height: 60px; /* 自定义行高 */ line-height: 60px; /* 确保文字垂直居中 */ } </style> ``` - **效果**:所有行高度统一变为 60px(默认约 48px)。 - **注意**:`/deep/` 是 Vue2 的穿透语法,若使用 SASS/LESS 需确保预处理器兼容[^1]。 --- #### 方法 2:使用 `:row-style` 属性(动态调整) 通过 `el-table` 的 `:row-style` 属性动态设置行高,适用于需要根据数据条件调整高度的场景。 **步骤**: 1. 在 `<el-table>` 上绑定 `:row-style` 属性。 2. 定义一个方法或对象,返回包含 `height` 的样式对象。 **示例代码**: ```vue <template> <el-table :data="tableData" :row-style="setRowHeight"> <!-- 列定义 --> </el-table> </template> <script> export default { methods: { // 动态设置行高 setRowHeight({ row, rowIndex }) { return { height: '50px', // 固定高度 lineHeight: '50px' // 垂直居中 }; } } }; </script> ``` - **效果**:每行高度动态设置为 50px。 - **优势**:可结合行数据(如 `row.age > 30` 时设更高高度)实现灵活控制。 --- #### 注意事项 1. **作用域问题**:在 scoped CSS 中,必须使用 `/deep/` 或 `::v-deep`(Vue2 别名)穿透组件样式隔离。 2. **兼容性**:Element UI 版本需 ≥ 2.x,低版本可能需调整类名(如 `.el-table__row` 在旧版中可能不同)。 3. **内容溢出**:增加行高后,若内容过长,建议添加 `.el-table .cell { white-space: nowrap; }` 防止换行。 4. **性能影响**:修改行高可能轻微影响渲染性能,建议在数据量大的表格中测试[^2]。 --- #### 相关问题 1. 如何修改 el-table 的表头高度? 2. 在 Vue2 中,如何正确使用 scoped CSS 覆盖 Element UI 的其他组件样式? 3. el-table 的行高调整是否会影响表格的响应式布局? [^1]: 引用[1] 提供了使用 `/deep/` 覆盖 el-table 样式的示例,类似方法适用于行高修改。 [^2]: 引用[2] 展示了 `:cell-style` 的应用,其原理与 `:row-style` 属性类似。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值