在vue项目中遇到这样一个问题,表单新增过程中需要向后端传递一组参数,参数格式如下:
这只为data中的一个对象
"probability": [{
"difficulty": 1,
"end": 5.0,
"probability": 50,
"start": 0.0
}, {
"difficulty": 1,
"end": 8.0,
"probability": 30,
"start": 6.0
}, {
"difficulty": 1,
"end": 10.0,
"probability": 20,
"start": 8.0
}, {
"difficulty": 2,
"end": 5.0,
"probability": 50,
"start": 0.0
}, {
"difficulty": 2,
"end": 8.0,
"probability": 30,
"start": 6.0
}, {
"difficulty": 2,
"end": 10.0,
"probability": 20,
"start": 8.0
}, {
"difficulty": 3,
"end": 5.0,
"probability": 50,
"start": 0.0
}, {
"difficulty": 3,
"end": 8.0,
"probability": 30,
"start": 6.0
}, {
"difficulty": 3,
"end": 10.0,
"probability": 20,
"start": 8.0
}
],
原型图如下:
要怎样实现这样的效果,在代码没有冗余的情况下,并且方便向后端传递参数?
分析:原型图中,难度配置分为三部分,(简单、普通、困难),在每一项中又有三条规则,一条规则中有三个参数,,但是后端接收只有四个字段。
可以看到 difficulty
分表难度,1、2、3分别代码简单、普通、困难,而 difficulty: 1
中,按顺序依次为规则一、规则二三。
方案一:
一个组件一个组件写,最简单粗暴的方法,虽然可以通过数组下标控制给每个参数赋值,但是代码数量有几百行,造成代码冗余,不符合开发理念,pass
方案二:
<template>
<div>
<el-dialog
append-to-body
:close-on-click-modal="false"
:before-close="crud.cancelCU"
:visible.sync="crud.status.cu > 0"
:title="crud.status.title"
width="650px"
>
<el-form
ref="form"
inline
:model="form"
:rules="rules"
label-width="100px"
>
<el-form-item label="难度配置:">
<el-form-item label="简单" />
<el-form-item
v-for="(item, index) in form.probability"
:key="index"
:label="isRule(index)"
style="margin-bottom: 0px;"
>
<el-form-item prop="start">
<el-input-number
v-model="item.start"
:precision="1"
controls-position="right"
:min="1"
:step="0.1"
:max="10"
style="width: 100px;"
/>
</el-form-item>
<span>—</span>
<el-form-item prop="end">
<el-input-number
v-model="item.end"
:precision="1"
controls-position="right"
:min="1"
:step="0.1"
:max="10"
style="width: 100px"
/>
</el-form-item>
<el-form-item
label="概率:"
style="margin-bottom: 0px; margin-left: 10px;"
prop="probability"
>
<el-input-number
v-model="item.probability"
controls-position="right"
:min="1"
:max="100"
style="width: 90px"
/>
<span>%</span>
</el-form-item>
</el-form-item>
</el-form-item>
</el-form></el-dialog></div>
</template>
<script>
export default {
name: 'Person',
methods: {
// 判断 规则
isRule(index) {
if (index === 0 || index === 3 || index === 6) {
return '规则一:';
} else if (index === 1 || index === 4 || index === 7) {
return '规则二:';
} else {
return '规则三:';
}
}
}
</script>
实现效果如下:
这样已经基本可以渲染出组件,难度没有办法渲染出来,但是如何向后端传递参数还是问题
方案三:
<el-form-item label="难度配置:">
<el-form-item
v-for="(item, index) in form.probability"
:key="index"
:label="isDifficulty(item.difficulty, index)"
style="margin-bottom: 0px;"
>
<el-form
ref="formItem"
:rules="formItemRules"
>
<el-form-item
:label="isRule(index)"
style="margin-bottom: 0px; margin-left: 24px;"
:required="true"
>
<el-form-item prop="start">
<el-input-number
v-model="item.start"
:precision="1"
controls-position="right"
:min="1"
:step="0.1"
:max="10"
style="width: 100px;"
/>
</el-form-item>
<span>—</span>
<el-form-item prop="end">
<el-input-number
v-model="item.end"
:precision="1"
controls-position="right"
:min="1"
:step="0.1"
:max="10"
style="width: 100px"
/>
</el-form-item>
<el-form-item
label="概率:"
style="margin-bottom: 0px; margin-left: 10px;"
prop="probability"
>
<el-input-number
v-model="item.probability"
controls-position="right"
:min="1"
:max="100"
style="width: 90px"
/>
<span>%</span>
</el-form-item>
</el-form-item>
</el-form>
</el-form-item>
</el-form-item>
<script>
export default {
name: 'Person',
methods: {
// 判断 规则
isRule(index) {
if (index === 0 || index === 3 || index === 6) {
return '规则一:';
} else if (index === 1 || index === 4 || index === 7) {
return '规则二:';
} else {
return '规则三:';
}
},
// 判断难度是否显示和难度等级
isDifficulty(difficulty, index) {
if (index === 0 || index === 3 || index === 6) {
if (difficulty === 1) {
return '简单:';
} else if (difficulty === 2) {
return '普通:';
} else {
return '困难:';
}
} else {
return '';
}
},
}
</script>
最终实现组件渲染,可以按规定格式向后端传递参数,并且最大限度的降低了代码冗余。