vue $set

作者: 神话降临 | 来源:发表于2018-07-19 17:24 被阅读0次

el-upload的bug

今天用element ui的el-upload功能的时候,在edge浏览器上传一个excel文件但是一直跳转到首页
浏览器请求数据显示的是

此资源没有相应负载数据
此资源没有查询字符参数
此资源没有cookie

调试之后发现是没有传token给后台,后台接受不到token就会返回异常状态码,从而登出系统
但是我明明传了参数为什么没有一块传给后台了

    <el-upload
                  class="upload-demo"
                  action="/api/v2/risk/uploadExcel"
                  :data="upLoadData"  
                  :on-success='flieSuccess'
                  :on-progress='flieProgress'
                  :show-file-list='showFileList'
                  multiple
                  :file-list="fileList">
                  <el-button size="small" type="primary" @click='changeUpDate'>导入数据</el-button>
                  <div slot="tip" class="el-upload__tip"></div>
    </el-upload>

upLoadData参数

    changeUpDate(){
        this.loadingText = '正在导入数据'
        this.upLoadData = {
            model: this.value,
            uid: this.uid,
            token: this.token
        }
    },

各种找,最后找打了一个关于vue机制的,才恍然大悟,它是这样写的

Vue 不允许在已经创建的实例上动态添加新的根级响应式属性 (root-level reactive property)。
如果在实例创建之后添加新的属性到实例上,它不会触发视图更新

意思就是说vue实例已经创建了,数据也都挂载在上面了,这个时候你在给一个对象增加新的属性,不好意思,我不伺候了

看个例子

<template>
  <div>
   <div>
     姓名: {{obj.name}},
     <br>
     年龄: {{obj.age}}
     <br>
     性别:{{obj.sex}}
   </div>
    <button @click="addSex">点击我增加性别</button>
  </div>
</template>

<script>
  export default{
    data(){
      return{
      obj:{name:'',age:''}
      }
    },
    methods:{
      addSex(){
         this.obj.sex = 'gril'
     
      }
    },
    created(){
      this.obj.name = 'lilei'
      this.obj.age = '25'
    },

  }
</script>


image.png

按照正常的情况,当我点击按钮的时候性别这一项应该显示为 性别:gril
但是点击之后是没有增加的

为什么会这样呢?当去查对应文档时,你会发现响应系统 ,把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项,Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter,如上示例,将data在控制台打印出来会发现:
image.png
在age及name都有get和set方法,但是在sex里面并没有这两个方法,因此,设置了sex值后vue并不会自动更新视图;

所以这个时候就需要用到$set了
我们把按钮方法修改一下

  addSex(){
        this.$set(this.obj,'sex','gril')
      }

再次打印一下obj

image.png

点击按钮


image.png

ok 正常了

还有一种数组改变视图不更新的情况
参数时数组,下标 值
this.$set(this.onlineNumber,j,parseInt(number[i]))

相关文章

网友评论

      本文标题:vue $set

      本文链接:https://www.haomeiwen.com/subject/wwitmftx.html