Javascript Vuejs和Vue.set(),更新数组
我是Vuejs的新手。做了点什么,但我不知道这是简单/正确的方法 我想要什么 我想要数组中的一些日期,并在事件中更新它们。首先我试了一下Vue.set,但没有成功。现在在更改我的数组项之后:Javascript Vuejs和Vue.set(),更新数组,javascript,vue.js,momentjs,vuejs2,Javascript,Vue.js,Momentjs,Vuejs2,我是Vuejs的新手。做了点什么,但我不知道这是简单/正确的方法 我想要什么 我想要数组中的一些日期,并在事件中更新它们。首先我试了一下Vue.set,但没有成功。现在在更改我的数组项之后: this.items[index] = val; this.items.push(); 我不向数组推送()任何内容,它将更新。。但有时最后一项会被隐藏,不知何故。。。我认为这个解决方案有点不成熟,如何使它稳定 简单代码如下: newvue({ el:“#应用程序”, 数据:{ f:'DD-MM-YYYY
this.items[index] = val;
this.items.push();
我不向数组推送()任何内容,它将更新。。但有时最后一项会被隐藏,不知何故。。。我认为这个解决方案有点不成熟,如何使它稳定
简单代码如下:
newvue({
el:“#应用程序”,
数据:{
f:'DD-MM-YYYY',
项目:[
"10-03-2017",
"12-03-2017"
]
},
方法:{
cha:函数(索引、项、内容、计数){
console.log(项+“索引>”+索引);
val=时刻(this.items[index],this.f).add(count,what).format(this.f);
此.项目[索引]=val;
this.items.push();
console.log(“arr长度:“+this.items.length”);
}
}
})
ul{
列表样式类型:无;
}
-
-一天
{{item}}
+一天
如果您这样操作阵列,VueJS将无法获取对状态的更改
如中所述,您应该使用push、splice等数组方法,并且永远不要修改像这样的索引a[2]=2
,也不要修改数组的.length属性
newvue({
el:“#应用程序”,
数据:{
f:'DD-MM-YYYY',
项目:[
"10-03-2017",
"12-03-2017"
]
},
方法:{
cha:函数(索引、项、内容、计数){
console.log(项+“索引>”+索引);
val=时刻(this.items[index],this.f).add(count,what).format(this.f);
此.items.$set(索引,val)
console.log(“arr长度:“+this.items.length”);
}
}
})
ul{
列表样式类型:无;
}
-
-第{{项目}天
+一天
EDIT 2
- 对于所有需要反应性的对象更改,请使用
Vue.set(对象、属性、值)
- 对于数组突变,您可以查看当前支持的列表
编辑1 对于vuex,您需要执行
Vue.set(state.object、key、value)
起初的 所以,对于其他提出这个问题的人来说。它出现在Vue 2中的某个位置。*他们删除了
this.items.$set(index,val)
而支持this.$set(this.items,index,val)
剪接仍然可用,下面是vue中可用的阵列突变方法的链接 如前所述-VueJS无法跟踪这些操作(数组元素分配)。 VueJS使用阵列跟踪的所有操作都是。 但我会再次复制它们:
- 推
- 流行音乐()
- 移位()
- 取消移位()
- 拼接()
- 排序()
- 反向
// note - findIndex might be replaced with some(), filter(), forEach()
// or any other function/approach if you need
// additional browser support, or you might use a polyfill
const index = this.values.findIndex(item => {
return (replacementItem.id === item.id)
})
this.values.splice(index, 1, replacementItem)
注意:如果您只需要修改项目字段-您可以通过以下方式完成:
this.values[index].itemField = newItemFieldValue
VueJS将跟踪这一点,因为项目(对象)字段将被跟踪
您需要清空数组:
this.values.splice(0, this.values.length)
实际上,您可以使用此功能执行更多操作
您可以添加多条记录、删除多条记录等
Vue.set()和Vue.delete()
Vue.set()和Vue.delete()可用于将字段添加到数据的UI版本中。例如,在对象中需要一些额外的计算数据或标志。可以对对象或对象列表(在循环中)执行此操作:
并在Axios调用之前以相同的格式将编辑后的数据发送回后端:
Vue.delete(plan, 'editEnabled') //(or this.$delete)
另一种解决问题的更轻量级方法可能是,暂时编辑数组,然后将整个数组分配回变量。因为Vue不监视单个项目,所以它将监视整个变量的更新 因此,您也可以这样做:
var tempArray[];
tempArray = this.items;
tempArray[targetPosition] = value;
this.items = tempArray;
这也会更新您的DOM。观察对象和数组的反应性:
正如文档中所说,$set只是一个漂亮的.splice()。这是有道理的,因为就像他们在文档中说的那样,你应该使用数组的方法修改数组。请不要将制表符缩进与空格缩进相结合,在SE应用程序中,制表符的大小显然不同,使您的代码难以读取在我的情况下,用于推送操作的ES6 spread运算符可能无法与VUE一起工作我需要提供什么字符串作为“索引”?@Kokodoko您能澄清一下您想做什么吗?如果它是一个数组,它应该是索引的数字。如果您在对象上设置字段,字符串就是。啊,好吧,我的IDE坚持它必须是字符串,一定是有问题。Vue.set不适用于vuex。还有这个。$set已弃用。@MartinCalvert它说“在向对象添加属性时”。这是Vue.set的主要用途,而不仅仅与vuex相关。不赞成,我在链接上读过,但现在再读一遍,我不完全理解它。
var tempArray[];
tempArray = this.items;
tempArray[targetPosition] = value;
this.items = tempArray;