首页  >  问答  >  正文

javascript - Vue.js计算属性使用set方法后,如何让该计算属性的值也跟着更新。

computed: {

cardNum: {
    get: function() {
        return this.ruleForm.cardNum;
    },
    set: function(val) {
        this.ruleForm.cardNum = val.substring(0, 20);
    }
}

}

我将该cardNum绑定给了input的v-model,想以此来实现对该值的过滤(vue.js2.0后不能给v-model的变量绑定过滤器好像),但发现当输入超过20个字符时,虽然this.ruleForm.cardNum会被截取,但cardNum却可超过20个字符,请教大神应该如何实现该字符长度限制功能呢?

天蓬老师天蓬老师2704 天前650

全部回复(3)我来回复

  • 習慣沉默

    習慣沉默2017-06-14 10:54:20

    我觉得主要应该是应用场景和思路的问题。

    1. 应用场景:一般情况下做表单验证都是在失去焦点或者当用户点击确定保存按钮的时候才去做的,然后弹出相应的文案提示,随便找一个什么度,什么企鹅的注册页面看看。你这样限制的话交互不够友好,而且导致你的实现思路偏差。

    2. 思路:对于computedv-model的理解,我不建议它两这样用。v-model本身就是为了实现双向绑定的,而使用computed就意味这要多写一个set方法,同时还要多一个中间值。

    如果真要实现,可以试试这样

    <input type="text" v-model="num">
    data() {return { num: '' }}
    watch: {
        num(a, b) {
            if (a.length > 20) { this.num = b }
        }
    
    }

    回复
    0
  • 大家讲道理

    大家讲道理2017-06-14 10:54:20

    不知道这样是否满足你的需求

    <input type="text" maxlength="20">

    回复
    0
  • 世界只因有你

    世界只因有你2017-06-14 10:54:20

    你这样做,计算属性的setter是不会触发的,除非手动触发 (vm)this.cardNum = 'what?'
    查看文档

    或者你可以直接使用vue提供的watcher处理,如下:

    watch: {
      'ruleForm.cardNum': function (newValue) {
         // do something...
      }
    }

    但不建议这样做

    回复
    0
  • 取消回复