实现的功能
勾选结算方式,输入价格,并对输入的价格进行验证和输入的限制。
具体的实现逻辑
<el-form size="mini" :model="prize" ref="prize">
<el-checkbox-group v-model="checkedPay">
<div
v-for="(type, index) in payType"
:key="type.label"
class="pay-name"
>
<el-checkbox
:label="type.label"
@change="handleCheckedPayChange(index, type)"
>
{{ type.name }}
</el-checkbox>
<el-form-item
label-width="100px"
label="单价"
v-if="modalShow[type.label]"
style="display:inline-block;"
:prop="type.label"
:rules="[{ required: true, message: '不能为空', trigger: 'blur' }]"
>
<el-input
step="0.1"
v-model="prize[type.label]"
@change="materielExtraCostChange(type.label)"
@keyup.native="
prize[type.label] = prize[type.label].replace(
prize[type.label],
RestrictedMoney(prize[type.label])
)
"
></el-input>
</el-form-item>
</div>
</el-checkbox-group>
</el-form>
<script>
/**
* 输入价格的限制
*/
var plusOrMinus = (values) => {
let newValue;
if (!/[^0-9.-]/g.test(values)) {
newValue = values
.replace(/[^\-\d.]/g, "")
.replace(/\b(0+){2,}/g, "0")
.replace(/-{2,}/g, "-")
.replace(/^\./g, "")
.replace(/\.{2,}/g, ".")
.replace(".", "$#$")
.replace(/\./g, "")
.replace("$#$", ".");
if (
newValue.toString().indexOf(".") > 0 &&
Number(newValue.toString().split(".")[1].length) > 2
) {
newValue = parseInt(parseFloat(newValue) * 100) / 100;
}
if (newValue.toString().split("-").length - 1 > 1) {
newValue = parseFloat(newValue) || "";
}
if (
newValue.toString().split("-").length > 1 &&
newValue.toString().split("-")[0].length > 0
) {
newValue = parseFloat(newValue) || "";
}
if (
newValue.toString().length > 1 &&
(newValue.toString().charAt(0) === "0" ||
(newValue.toString().length > 2 &&
newValue.toString().charAt(0) === "-" &&
newValue.toString().charAt(1) === "0" &&
newValue.toString().charAt(2) !== ".")) &&
newValue.toString().indexOf(".") < 1
) {
newValue = parseFloat(newValue) || "";
}
// 判断整数位最多为9位
if (
newValue.toString().indexOf(".") > 0 &&
Number(newValue.toString().split(".")[0].length) > 9
) {
newValue =
newValue.toString().substring(0, 9) +
"." +
newValue.toString().split(".")[1];
} else if (
newValue.toString().indexOf(".") < 0 &&
Number(newValue.toString().split(".")[0].length) > 9
) {
newValue = newValue.toString().substring(0, 9);
}
} else {
newValue = values.replace(/[^0-9.-]/g, "");
}
return newValue;
}
data() {
var checkPrize = (rule, value, callback) => {
if (!value) {
return callback(new Error("不能为空"));
}
};
var RestrictedMoney = values => {
return plusOrMinus(values.toString());
};
return {
RestrictedMoney: RestrictedMoney,
payType: [
{
label: "anzhuang",
name: "安装"
},
{
label: "jihuo",
name: "激活"
},
{
label: "zhuce",
name: "注册"
},
{
label: "cps",
name: "CPS"
}
],
modalShow: {},
checkedPay: [],
prize: {
anzhuang: "",
jihuo: "",
zhuce: "",
cps: ""
},
rules: {
anzhuang: [{ validator: checkPrize, trigger: "blur" }],
jihuo: [{ validator: checkPrize, trigger: "blur" }],
zhuce: [{ validator: checkPrize, trigger: "blur" }],
cps: [{ validator: checkPrize, trigger: "blur" }]
}
};
},
created() {
for (let i in this.payType) {
this.$set(this.modalShow, this.payType[i].label, false);
}
},
methods: {
handleCheckedPayChange(i, type) {
if (this.checkedPay.indexOf(type.label) !== -1) {
this.modalShow[type.label] = true;
} else {
this.modalShow[type.label] = false;
this.prize[type.label] = "";
}
},
setData() {
var _self = this;
return this.checkedPay.map(item => {
let current = _self.payType.find(cur => {
return cur.label === item;
});
return {
payment_method: current.name,
payment_amount: _self.prize[current.label] || 0
};
});
},
sendPostData() {
this.$refs["prize"].validate(valid => {
if (valid) {
alert('提交);
}else {
console.log('出错);
}
},
materielExtraCostChange(label) {
// 防止删除为空
if (!this.prize[label]) {
this.prize[label] = "0.00";
}
// 一些错误金额输入的判断
if (
this.prize[label].toString().indexOf(".") > 0 &&
Number(this.prize[label].toString().split(".")[1].length) < 1
) {
this.prize[label] = this.prize[label].toString().split(".")[0];
}
this.prize[label] = parseFloat(this.prize[label]).toFixed(2);
}
}
</script>