vue中watch的newVal和oldVal相同

data() {
    ...,
    search: {
      gather: [],
      page: {
        current: 1,
        size: 5
      }
    }
},
methods() {
  ...,
  // 新增搜索条件
  addSearch() {
    const input = this.searchInput

    let copySearch = {...this.search}

    copySearch.gather.push({
      fieldName: this.searchColumns[input.field],
      field: input.field,
      terms: input.terms,
      value: input.value
    })
    console.log('search===copySearch:', this.search === copySearch)
    this.search = copySearch

    input.field = ''
    input.terms = ''
    input.value = ''
  },
  // 删除搜索条件。由Tag组件,触发on-close
  deleteSearch(event, item) {
    const index = this.search.gather.indexOf(item)
    let copySearch = {...this.search}
    copySearch.gather.splice(index, 1)
    
    console.log('search===copySearch:', this.search === copySearch)
    this.search = copySearch
  },
},
watch: {
  // 深度监听
  search: {
    handler: function(newS, oldS) {
      console.log(newS)
      console.log(oldS)
      console.log('newS===oldS:', newS === oldS)
      if (newS.gather.length !== oldS.gather.length) {
        this.page.current = 1
      }
      this.tableNewData()
    },
    deep: true
  }
}

图片描述

https://cn.vuejs.org/v2/api/#...
注意:在变异 (不是替换) 对象或数组时,旧值将与新值相同,因为它们的引用指向同一个对象/数组。Vue 不会保留变异之前值的副本。

替换了对象也不起作用,是我哪里写错了吗? 望各路大神帮忙,我折腾一天了。

阅读 7.4k
1 个回答

let copySearch = {...this.search}这个也不算深复制吧,属性gather还是对同一个数组的引用吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题