这篇文章是记录上个月开发中的问题,有知道原理的请发送邮件
0727
我吐了,element-ui,这玩意咋这么多坑
背景
点击某个按钮,打开内嵌表单的dialog,然后不能让用户手动输入值,要根据后台去查可选项,将可选项变成可视化的表格,表格包含基本信息,再让用户去选;因为有两项值都是这样操作的,即通过表格选择,然后两组数据有部分重叠,但属性名有部分不同,为了省事,就做在一个dialog中了,然后坑爹的地方来了;
在同一个Dialog中渲染不同的表格,其中有使用template的列,该列用来进行操作,刚开始想着复用,即将属性名相同的列不做处理,将其他有不同的列用v-if作判断,该显示哪个,然后翻车了,列的顺序是乱的,数据有时候也不对,就变成了两个表格,每个表格用v-if判断。
然后就又翻车了,见下方问题说明。
问题
在刚点进的时候正常,第一个表格有7列,第七列是操作按钮,第二个表格有六列,第六列是操作按钮,按钮的功能是一样的,绑定的方法也是同一个,然后神奇的来了,显示第一个表,显示正常,关闭Dialog后显示第二个表格,也正常;关闭后再显示第一个表格,第六列变为了操作按钮,列名没有变化,但内容变了???,下方代码是例子
<el-dialog :title="Title" :visible.sync="dialogVisible" width="1000px">
<el-table v-if="type==1" :data.sync="data">
<el-table-column label="1" property="1"></el-table-column>
<el-table-column label="2" property="2"></el-table-column>
<el-table-column label="3" property="3"></el-table-column>
<el-table-column label="4" property="4"></el-table-column>
<el-table-column label="5" property="5"></el-table-column>
<el-table-column label="6" property="6"></el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="Sumit(scope.row)">选择</el-button>
</template>
</el-table-column>
</el-table>
<el-table v-if="type==2" :data.sync="data">
<el-table-column label="1" property="1"></el-table-column>
<el-table-column label="2" property="2"></el-table-column>
<el-table-column label="3" property="3"></el-table-column>
<el-table-column label="4" property="4"></el-table-column>
<el-table-column label="5" property="5"></el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="Sumit(scope.row)">选择</el-button>
</template>
</el-table-column>
</el-table>
</el-dialog>
问题解决
我认为是渲染第二个表格后,再次渲染第一个表格,虚拟dom对比将第二个表格的操作列,直接识别成是相同的节点,没有删除,在第二个表格内部加上blockquote,然后就好使了
<el-table v-if="type==2" :data.sync="data">
<blockquote>
<el-table-column label="1" property="1"></el-table-column>
<el-table-column label="2" property="2"></el-table-column>
<el-table-column label="3" property="3"></el-table-column>
<el-table-column label="4" property="4"></el-table-column>
<el-table-column label="5" property="5"></el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="Sumit(scope.row)">选择</el-button>
</template>
</el-table-column>
</blockquote>
</el-table>
问题2
好使是好使了,但是乱序了,第一列跑到最后一列了。。。
问题2解决
改变思路,将操作按钮列去掉,在第一列添加单选按钮,绑定需要传输的值,选中后点击表格下方的确认按钮,成功解决
<el-table v-if="type==1" :data.sync="data">
<el-table-column label="选择" align="center">
<template slot-scope="scope">
<el-radio v-model="radio" :label="scope.row.id1">
<!--blockquote 为了占位,不然el-radio会默认在后面显示label内容,但我们不需要显示,<div></div>也可以 -->
<blockquote></blockquote>
</el-radio>
</template>
</el-table-column>
<el-table-column label="1" property="1"></el-table-column>
<el-table-column label="2" property="2"></el-table-column>
<el-table-column label="3" property="3"></el-table-column>
<el-table-column label="4" property="4"></el-table-column>
<el-table-column label="5" property="5"></el-table-column>
<el-table-column label="6" property="6"></el-table-column>
</el-table>
<el-table v-if="type==2" :data.sync="data">
...和上面的表格差不多
</el-table>
<div>
<el-button type="primary" @click.stop.prevent="sumit"> 确定 </el-button>
<el-button @click="dialogVisible = false;"> 取消 </el-button>
</div>
改进
结合单选表格的监听事件,在单选表格的行的时候选中该行的单选按钮,但不出意外的出问题了
改进的问题
虽然功能无异常,但是在关闭dialog的时候不知道为什么会调用一次行点击监听事件,控制台报错,因为没有值,单选按钮的监听事件是会传入行的数据的,但这次错误调用是没有的,而且下面还有根据数据进行的处理。我真的服了,但改用还是得用
改进问题解决
找了半天还是没找到为啥会在dialog关闭的时候调用table的单选行监听,不关闭啥事没有,一关闭就不知道哪里来的单选行方法的调用;最后只能用笨方法,在传入值后,关闭时将radio的值为null,判断radio是否为null, 是的话,不让他执行里面的操作,然后在打开dialog的时候将值设置为""空字符串,通过radio的值来判断是不发第一次调用。没招了,毁灭吧。
标签:ui,关闭,表格,element,单选,dialog,按钮,table,操作 From: https://www.cnblogs.com/piaohd/p/17685674.html