前几天改了一个bug,bug是说el-date-picker这个时间日期选择器选择的时间不能实时更新

chang方法不生效需要使用input方法 

最开始我尝试在去打印一下他的时间,根据官方文档chang方法是可以获取到他的最新时间的,结果使用chang方法并不生效,最后尝试着使用input方法(只要输入的值变化了就会触发input)

 <el-form-item label="起止日期:" prop="time">
      <el-date-picker
      v-model="form.time"
      type="datetimerange"
      clearable
      range-separator="-"
      value-format="yyyy-MM-dd HH:mm:ss"
      start-placeholder="开始时间"
      end-placeholder="结束时间"
      @input="selectTime"
     />
  </el-form-item>

修改时间数据不更新需要使用vue响应式$set

input方法生效之后我开始尝试修改(直接覆盖v-model的值)他的日期时间,但是页面上并没有更新,

于是我先打印出来了数据,结果发现数据是更新的,所以数据更新,页面不更新,这里就需要用到vue的响应式了

为什么要用$set

由于Object.defineProperty()的限制,新增或删除对象属性以及数组里面里面使用索引更新数据无法拦截,需要通过 Vue.set 及 delete 这样的 API 才能生效

在vue中,并不是任何时候数据都是双向绑定的。
在官方文档中,有这样一段话,如下:
在这里插入图片描述

从文档得知,当数据没有被双向绑定的时候,我们就需要使用set了

    selectTime(data) {
      this.$nextTick(() => {
        //不生效
        this.form.form = [data[0], data[1]]; 
        //生效成功更新数据并更新页面
        this.$set(this.form, 'time', [data[0], data[1]]);  
      });
    },

如果使用$set还没有生效的话那可能就是设置的key已经存在于这个对象(form)或数组中的时候,它只会更改data并不会为该key添加响应检测,所以页面上的依赖warehouseOpt的试图就不会更新,解决这个问题的办法就是在设置值之前先把这个属性删除掉,然后再进行this.$set

    selectTime(data) {
      this.$nextTick(() => {
        //先使用$delete对该属性进行删除,才能重新检测到该数据的变化
        this.$delete(this.form, 'time');  
        //生效成功更新数据并更新页面
        this.$set(this.form, 'time', [data[0], data[1]]);  
      });
    },

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐