在NativeScript Vue ListView中管理组件状态

在NativeScript Vue ListView中管理组件状态,listview,nativescript-vue,Listview,Nativescript Vue,我在管理NativeScript Vue ListView中的组件状态时遇到问题。我在下面的文章中解释了完全相同的问题:。本文没有解释Nativescript Vue的解决方案。我在ListView中使用开关组件来保持列表项的状态,不管它们是否被选中,但没有办法。是否有人遇到过同样的问题并在文章中为NativeScript Vue应用了解决方案?这实际上很容易解决。因为listview重用组件,所以我们不应该在组件内部设置数据。我们应该做的是添加/更改数组中对象内部的数据,以便listview可

我在管理NativeScript Vue ListView中的组件状态时遇到问题。我在下面的文章中解释了完全相同的问题:。本文没有解释Nativescript Vue的解决方案。我在ListView中使用开关组件来保持列表项的状态,不管它们是否被选中,但没有办法。是否有人遇到过同样的问题并在文章中为NativeScript Vue应用了解决方案?

这实际上很容易解决。因为listview重用组件,所以我们不应该在组件内部设置数据。我们应该做的是添加/更改数组中对象内部的数据,以便listview可以正确地更新这些项

您可以添加一个在父级上触发的事件,以通过点击来更新开关更改列表,因为每次重新提交/重用listview中的组件都会触发开关更改事件。 这有点难管理,但确实有效

<Template>
  <StackLayout @tap="onSwitchTapped" orientation="horizontal">
     <Switch :isUserInteractionEnabled="false" v-model="item.isActive"/>
  </StackLayout>
</Template>
<Script>
   export default {
      props: {
           item: null,
           onItemUpdated: null
      }
      methods: {
         onSwitchTapped()
         {
             this.item.isActive = !this.item.isActive;
             if(onItemUpdated != null)
                onItemUpdated(this.item);
         }
      }
   }
</Script>

<Template>
    <ListView for="item in array">
        <component :item="item" :onItemUpdated="onItemUpdated"/>
    </ListView>
</Template>

<Script>
   export default {
       onItemUpdated(item) {
          this.array[item.index] = item;
       }
   }
</Script>

导出默认值{
道具:{
项目:空,
未更新:空
}
方法:{
onswitch()
{
this.item.isActive=!this.item.isActive;
如果(已更新!=null)
已更新(本项目);
}
}
}
导出默认值{
已更新(项目){
this.array[item.index]=item;
}
}
您还可以删除开关并在listview上添加一个itemTap,然后在列表中设置数据:

<ListView for="item in array" @itemTap="itemTapped">

itemTapped(evt) {
    this.array[evt.index].VARIABLE = true/false;
}

项目(evt){
this.array[evt.index].VARIABLE=true/false;
}

它实际上很容易修复。因为listview重用组件,所以我们不应该在组件内部设置数据。我们应该做的是添加/更改数组中对象内部的数据,以便listview可以正确地更新这些项

您可以添加一个在父级上触发的事件,以通过点击来更新开关更改列表,因为每次重新提交/重用listview中的组件都会触发开关更改事件。 这有点难管理,但确实有效

<Template>
  <StackLayout @tap="onSwitchTapped" orientation="horizontal">
     <Switch :isUserInteractionEnabled="false" v-model="item.isActive"/>
  </StackLayout>
</Template>
<Script>
   export default {
      props: {
           item: null,
           onItemUpdated: null
      }
      methods: {
         onSwitchTapped()
         {
             this.item.isActive = !this.item.isActive;
             if(onItemUpdated != null)
                onItemUpdated(this.item);
         }
      }
   }
</Script>

<Template>
    <ListView for="item in array">
        <component :item="item" :onItemUpdated="onItemUpdated"/>
    </ListView>
</Template>

<Script>
   export default {
       onItemUpdated(item) {
          this.array[item.index] = item;
       }
   }
</Script>

导出默认值{
道具:{
项目:空,
未更新:空
}
方法:{
onswitch()
{
this.item.isActive=!this.item.isActive;
如果(已更新!=null)
已更新(本项目);
}
}
}
导出默认值{
已更新(项目){
this.array[item.index]=item;
}
}
您还可以删除开关并在listview上添加一个itemTap,然后在列表中设置数据:

<ListView for="item in array" @itemTap="itemTapped">

itemTapped(evt) {
    this.array[evt.index].VARIABLE = true/false;
}

项目(evt){
this.array[evt.index].VARIABLE=true/false;
}

我尝试了您的解决方案,但它不起作用,尤其是当我尝试使用“checkedChange”事件更新状态时。因为当我滚动列表时,许多开关元素会触发“checkedChange”事件,而应用程序会尝试通过将APICALL设置为backed来更新列表元素的状态。所以,一切都搞砸了。我不明白他们为什么触发“checkedChange”事件。因为在我看来,他们应该只在用户点击时触发该事件。否则就完全没用了。所以,我放弃使用“checkedChange”并使用“tap”事件。现在一切都正常了。@kempo哦,我明白了,嗯,我想这是因为布尔值是由ListView设置的,所以每当列表中出现新项目时,它都会触发checkedChange(重新使用,以便重置所有变量)。@kempo我编辑了答案,解释了checkedChange问题。由于它对您有效,您能检查我的答案是否正确,以供将来可能与您有相同问题的用户使用吗?实际上,目前不容易尝试,因为我需要使用开关组件,我完成了这一部分。如果您给我一个使用开关组件的解决方案,我非常感谢您的尝试。@kempo再次编辑了答案,请检查这是否对您有效。我尝试了您的解决方案,但它不起作用,特别是当我尝试使用“checkedChange”事件更新状态时。因为当我滚动列表时,许多开关元素会触发“checkedChange”事件,而应用程序会尝试通过将APICALL设置为backed来更新列表元素的状态。所以,一切都搞砸了。我不明白他们为什么触发“checkedChange”事件。因为在我看来,他们应该只在用户点击时触发该事件。否则就完全没用了。所以,我放弃使用“checkedChange”并使用“tap”事件。现在一切都正常了。@kempo哦,我明白了,嗯,我想这是因为布尔值是由ListView设置的,所以每当列表中出现新项目时,它都会触发checkedChange(重新使用,以便重置所有变量)。@kempo我编辑了答案,解释了checkedChange问题。由于它对您有效,您能检查我的答案是否正确,以供将来可能与您有相同问题的用户使用吗?实际上,目前不容易尝试,因为我需要使用开关组件,我完成了这一部分。如果您给我一个使用开关组件的解决方案,我非常感谢您的尝试。@kempo再次编辑了答案,请检查这是否适用于您。