Vue改变数组值,页面视图为什么不刷新?

gg.gif

一、iview table 自定义序号

WX201912191855372x.png

将其对应的type设为 index 便可vue

{
    title: "序号",
    width: 70,
    align: "left",
    type: "index"
}
复制代码

二、父子组件传值,父组件调用子组件方法

场景:iview 中 封装一个modal 组件公共引用数组

父组件:bash

// 引入组件
import orderModal from './orderModal.vue'
// 使用
<order-modal 
  :showPop="showPop"    // 控制组件的显示关闭
  :orderData="orderData"      // 数据
  :orderH1="orderH1"
  :btnText="btnText"
  @on-close="hidePop">    // 将子组件的方法传递给父组件使用
</order-modal>

// 父组件方法
hidePop(e,type){
    if(type !== undefined){
      // 方法
    }
    this.showPop = e  // 关闭弹窗 e 为子组件传递过来的值
},
复制代码

子组件iview

<Modal 
    v-model="currentValue"  // 子组件中接受父组件的 isShowAdd
    @on-cancel="cancel">    // Modal 的关闭事件
    <Form   
        ref="orderData" 
        :model="orderData">  // 接受传递的数据
    </Form>
</Modal>

// 子组件 props接受传递参数
props: ['showPop','orderData','orderH1','btnText'],
复制代码

这里本来 ==v-model== 使用的使传递过来的 ==showPop== 做为参数,一开始没有问题,可是若是我想将子组件的关闭方法提到父组件去触发 那么 直接在 父组件 ==this.showPop = false==。那么就会提示报错,由于 Vue使单向数据流不能直接改版传递子组件的值。改为以下:异步

// 在子组件中用watch来监听 isShowAdd 是否变化,
而后赋值给 currentValue
watch: {
  isShowAdd(value,val) {
    this.currentValue = value
  }
}
// 子组件的关闭操做提高到父组件 $emit
cancel(type){
    this.$emit('on-close', false, type)
}

复制代码

三、网上的资料以下图:

vue父子组件传值.png

总结:

这个问题还折腾了快半个小时,归根到底仍是不常常使用的后果,好多代码以前都用过,像封装组件这种还要折腾,简直是不知道说什么好呀,只能之后多使用了。ide

四、Vue改变数据视图不更新

4.1 异步更新队列

Vue 异步执行 DOM 更新。只要观察到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的全部数据改变。

若是同一个 watcher 被屡次触发,只会被推入到队列中一次。

这种在缓冲时去除重复数据对于避免没必要要的计算和 DOM 操做上很是重要。

而后,在下一个的事件循环“tick”中,

Vue 刷新队列并执行实际 (已去重的) 工做。

Vue 在内部尝试对异步队列使用原生的 Promise.then 和 MessageChannel,若是执行环境不支持,会采用 setTimeout(fn, 0) 代替。
复制代码

解决方法ui

this.$nextTick()
复制代码

4.2 数组改变视图不更新

经过如下数组方法可让vue监测数组改动this

push()

pop()

shift()

unshift()

splice()

sort()

reverse()
复制代码

4.3 vue不能检测到对象属性的添加或删除

因为 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,因此属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的spa

解决方法code

一、Vue.set(object, key, value)

二、Object.assign() 或 _.extend() 方法来添加属性。
复制代码

可是第二种方法,添加到对象上的新属性不会触发更新。在这种状况下能够建立一个新的对象,让它包含原对象的属性和新的属性:

// 代替 `Object.assign(this.someObject, { a: 1, b: 2 })`

this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })  // 深拷贝

复制代码
相关文章
相关标签/搜索