vue+element-ui 实现价格的输入限制

实现的功能

预览
勾选结算方式,输入价格,并对输入的价格进行验证和输入的限制。

具体的实现逻辑

<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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值