vue-element-ui下拉框返回对象
起因
原本并不需要考虑这种形式,但是无奈后端提供的接口数据并没有描述相关的配置项。
需求是在一个form中的select被选择后(具体数据是一个IP地址),以popover的形式显示包含这个IP地址的对象的全部信息。众所周知,select中的option备选项是一个数组,比如我在created()阶段收到的数组元素之一如下:
{
host_name: "第一台测试服务器",
host_type: 0,
id: 1,
location: "香港",
private_ip: "10.78.100.5",
public_ip: "100.100.100.100:9527"
}
处理选择
那么很显然,在option标签中,使用v-for取出item就可以渲染出这些备选项,而select组件已经为我们绑定了表单数据,在之前定义的:value=“item.public_ip”就代表填充到表单里的值,是我要的IP地址。
但是数据预览的需求是,不仅要看到IP地址,还要看到host_name、host_type、id这些json数组对象中的其他信息,
可是并没有提供映射的配置信息,所以我···用到了:
:value=“item”
可是这里要注意,此时的item是一个对象,那么在外层的select中,要添加这个属性
value-key=“public_ip”
值应该是item对象里的唯一值,不然你连编译都别想过~
那么现在点击了选项后,select会把数据绑定在我定义的中间变量里
selected_center_or_edge_hosts
本来这个变量应该是直接在form表单变量中的数组就可以了,但是为了存下所有的item信息,并且提交表单的时候,
后端哥也懒得处理解析json中的IP地址—总之就是让我多解析一步都不行···
于是就想了一个折中的这个变量,选中的所有值都给它给它给它!
所以我绑定了一个方法,当选择的值发生变化,就会执行里面的动作:
1、先给select绑定方法,传递事件:
@change=“change_selected_center_or_edge_hosts($event)”
2、之后定义执行动作:
change_selected_center_or_edge_hosts(e) {
this.form.center_or_edge_hosts = this.selected_center_or_edge_hosts.map(x => { return x.public_ip }) // 生成数组
}
这里就很明显了,我把选中的item数组中的public_ip取出来,赋值给了form表单里的原本该传的数组。
处理预览
至于预览,在select外层包裹一个popover + table的组件就可以了,但是这样的话一定要记得在select上添加这个属性: slot=“reference” 不然你别想再看到你的select选择器了!
提交请求后的清空处理
当执行了onSubmit之后,正常只要将this.form置空就行了,但是由于有selected_center_or_edge_hosts的存在,
所以我们也要将它置空,而这个需求其实还会要求当一个form中的radio-group切换时,这个select的备选选项数组也要变,所以在切换radio的时候,它的change方法里,也要置空selected_center_or_edge_hosts,不然你休想提交正确的信息了!
vue代码
<el-form-item
label="填坑的文本标题"
prop="center_or_edge_hosts"
>
<el-popover
placement="top-start"
trigger="hover"
width="800"
>
<el-table :data="selected_center_or_edge_hosts">
<el-table-column
width="50"
property="id"
label="id"
/>
...
...多个el-table-column
...
</el-table>
<el-select
slot="reference"
v-model="selected_center_or_edge_hosts"
multiple
placeholder="可多选"
value-key="public_ip"
style="width: 100%;"
@change="change_selected_center_or_edge_hosts($event)"
>
<div v-if="form.room_directing_host_type === 0">
<el-option
v-for="item in center_hosts"
:key="item.public_ip"
:label="item.public_ip"
:value="item"
/>
</div>
<div v-else>
<el-option
v-for="item in edge_hosts"
:key="item.public_ip"
:label="item.public_ip"
:value="item"
/>
</div>
</el-select>
</el-popover>
</el-form-item>
总结
其实只是一个小小的select-option要取的值是备选数组中的一个json的小问题,如果我直接发送这个数据,后端做解析是很容易的,但是因为后端没有处理,那我只好自己想办法啦。
当然如果在页面初始化的时候,给我一个动态返回的IP地址和其他信息的映射关系,我也不需要将耦合度如此之高的数据类型搞来搞去,所以要自寻解决办法~
遇事不决,量子力学!