Vue -如何为对象数组中的对象添加React属性?

knsnq2tg  于 2023-05-01  发布在  Vue.js
关注(0)|答案(4)|浏览(536)

我有一个来自后端的对象数组。我需要在每个对象上添加额外的数据来发送。
我输入的数据看起来像这样:

let arr = [
  {
    id: 1,
    city: 'Orlando',
  },
  {
    id: 2,
    city: 'Miami',
  },
  {
    id: 3,
    city: 'Portland',
  }
]

当数据通过Vue加载时,我需要让这些属性具有响应性。这意味着vue可以看到这些值何时发生变化,并调用适当的生命周期方法。Seewww.example. www.example.com

let newArr = [
  {
    id: 1,
    city: 'Orlando',
    state: 'Fl',
    country: 'USA',
  },
  {
    id: 2,
    city: 'Miami',
    state: 'Fl',
    country: 'USA',
  },
  {
    id: 3,
    city: 'Portland',
    state: 'OR',
    country: 'USA',
  }
]

在vanillaJS中,你不能只是循环并将属性附加到每个对象上,那么你会怎么做呢?

2mbi3lxu

2mbi3lxu1#

vue文档建议在追加属性时使用Object.assign,以使其具有响应性

// instead of `Object.assign(this.someObject, { a: 1, b: 2 })`
this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })

但是,这只是当你必须附加一个对象。
对于对象列表,这是初始化数据的方式

newArr = arr.map(item => {
  let newItem = Object.assign({}, item, {
    state: undefined,
    country: undefined,
  });
  return newItem;
});

现在,对象数组中的所有对象属性都是响应式的

mtb9vblg

mtb9vblg2#

Vue还拦截了对Array.push的调用,所以你可能更喜欢这个:

arr.forEach(item => newArr.push(item))
i34xakig

i34xakig3#

很晚了,但想到了提供答案,因为它可以在未来对其他人有用:
如果你想给一个对象数组中的某个对象添加一个额外的属性,那么你可以使用这样的方法:

var searchId = 1

const cityInfo = arr.find(ele => ele.id === searchId)
Vue.set(identifiersNode, 'state', "Karnataka")
Vue.set(identifiersNode, 'country', "India")
qacovj5a

qacovj5a4#

最好的方法是创建一个计算属性。

1.无店铺

一个Vue组件,像这样:

data() {
 return {
  arr: []
 }
},
methods: {
 fetchArr() {
  // fetch array data
  this.arr = [...]
},
computed: {
 newArr() {
   return this.arr.map(item => {
    item.contry = '...'
    item.state = '...'
    return item
  })
 }

2.带商店(Vuex)

state() {
 return {
  arr: []
 }
}

mutations: {
  setArr(state, arr) {
   state.arr = arr
  }
}

actions: {
 fetchArr({commit}) {
 // api call
 commit('setArr', arr)
 }
}

getters: {
 newArr(state) {
  return state.arr.map(item => {
        item.contry = '...'
        item.state = '...'
        return item
      })
  }
}

相关问题