组件渲染及参数传递

在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>

在这里插入图片描述
最终实现组件渲染,可以按规定格式向后端传递参数,并且最大限度的降低了代码冗余。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值