Vue.js 与Vue对象阵列的反应性

Vue.js 与Vue对象阵列的反应性,vue.js,reactive,Vue.js,Reactive,希望你安全健康 我正在使用vue自定义组件,其中我使用v-for为每个资产(子组件)渲染子卡。每个子卡都有一个复选框,该复选框与最终用户选择的卡有关 现在,家长有一个全选和取消全选功能来选中/取消选中所有子卡 我可能采用了错误的方法。但selectAll和UnselectAll不会更新选定属性的状态 母公司: 模板 脚本 data(){ 返回{ 所选资产:[] } }, 计算:{ …地图绘制者({ 资产列表:“资产列表” }) }, 方法:{ …映射操作({ fetchAssets:'get

希望你安全健康

我正在使用vue自定义组件,其中我使用v-for为每个资产(子组件)渲染子卡。每个子卡都有一个复选框,该复选框与最终用户选择的卡有关

现在,家长有一个全选和取消全选功能来选中/取消选中所有子卡

我可能采用了错误的方法。但selectAll和UnselectAll不会更新选定属性的状态

母公司: 模板


脚本

data(){
返回{
所选资产:[]
}
},
计算:{
…地图绘制者({
资产列表:“资产列表”
})
},
方法:{
…映射操作({
fetchAssets:'getContentDeliveryAssets'
}),
markAll:函数(已选择){
如果(选定){
this.assetsList.forEach(item=>item['selected']=true)
}否则
this.assetsList.forEach(item=>item['selected']=false)
}
}
子组件 模板


脚本

data(){
返回{
数据:{},
塞尔:错
}
},
观察:{
//eslint禁用下一行
数据:{
句柄:函数(newVal){//观察它
console.log(newVal)
//this.sel=newVal
},
深:是的
}
},

由于
assetsList
来自Vuex商店的
AssetList
getter,因此您不应该直接进行更改。如果将Vuex设置为,实际上会开始抛出错误

相反,您应该为
markAll
创建一个变体,并从组件提交它

比如说

//存储
导出默认的新Vuex.Store({
严格:对,//总是个好主意
声明:{
AssetList:[]//这里只是猜测
},
吸气剂:{
AssetList:state=>state.AssetList//也可以猜测
},
突变:{
markAll:(状态,选中)=>{
//最好将状态视为不可变的,并分配新值
//而不是试图改变它们
state.AssetList=state.AssetList.map(项=>({
…项目,
挑选出来的
}))
}
}
})
在你的组件中

方法:{
…地图突变(['markAll']),
…映射操作({
fetchAssets:'getContentDeliveryAssets'
}
}

对于处理单个项目的更改,您显然需要另一个变体

突变:{
markItem:(状态,{item,selected})=>{
const storeItem=state.AssetList.find(storeItem=>storeItem==item)
如果(storeItem)storeItem.selected=已选择
},
//马卡尔。。。
}
在您的子组件中,使用getter和setter的computed属性来处理更改事件


从“vuex”导入{mapTranslations}
导出默认值{
道具:{data:Object},
计算:{
sel:{
get(){返回this.data.selected},
set(selected){this.markItem({item:this.data,selected})}
}
},
方法:MAP突变(['markItem'])
}

由于
assetsList
来自Vuex应用商店的
AssetList
getter,因此不应直接进行更改。如果将Vuex设置为,则实际上会引发错误

相反,您应该为
markAll
创建一个变体,并从组件提交它

比如说

//存储
导出默认的新Vuex.Store({
严格:对,//总是个好主意
声明:{
AssetList:[]//这里只是猜测
},
吸气剂:{
AssetList:state=>state.AssetList//也可以猜测
},
突变:{
markAll:(状态,选中)=>{
//最好将状态视为不可变的,并分配新值
//而不是试图改变它们
state.AssetList=state.AssetList.map(项=>({
…项目,
挑选出来的
}))
}
}
})
在你的组件中

方法:{
…地图突变(['markAll']),
…映射操作({
fetchAssets:'getContentDeliveryAssets'
}
}

对于处理单个项目的更改,您显然需要另一个变体

突变:{
markItem:(状态,{item,selected})=>{
const storeItem=state.AssetList.find(storeItem=>storeItem==item)
如果(storeItem)storeItem.selected=已选择
},
//马卡尔。。。
}
在您的子组件中,使用getter和setter的computed属性来处理更改事件


从“vuex”导入{mapTranslations}
导出默认值{
道具:{data:Object},
计算:{
sel:{
get(){返回this.data.selected},
set(selected){this.markItem({item:this.data,selected})}
}
},
方法:MAP突变(['markItem'])
}

如果
assetsList
在您的应用商店中,您绝对不应该进行直接更改。相反,您应该提交一个mutationYes assetList在应用商店中,我不会调用任何操作来更改值。这能解决问题吗?如果
assetsList
在您的应用商店中,您绝对不应该进行直接更改nges。相反,您应该提交一个mutationYes assetList正在存储中,我没有调用任何操作来更改该值。这能解决问题吗?有意义!但是,通过这种方法,我收到了以下消息:```js vue.runtime.esm.js?2b0e:1888 TypeError:无法读取Watcher.run上未定义的属性'call'(vue.runtime.esm.js?2b0e:4568)在flushSchedulerQueue(vue.runtime.esm.js?2b0e:4310)在Array.eval(vue.runtime.esm.js?2b0e:1980)在flushCallbacks(vue.runtime.esm.js?2b0e:1906)上“``有道理!但是,通过这种方法,我收到了以下消息:``js vue.runtime.esm.js?2b0e:1888 TypeError:无法读取unde的属性'call'