在 NativeScript-Vue ListView 中管理组件状态

Posted

技术标签:

【中文标题】在 NativeScript-Vue ListView 中管理组件状态【英文标题】:Managing component state in NativeScript-Vue ListView 【发布时间】:2019-12-24 10:48:54 【问题描述】:

我时遇到问题。我在以下文章中遇到了完全相同的问题:https://www.nativescript.org/blog/managing-component-state-in-nativescript-listview。文章不解释 Nativescript-Vue 的解决方案。我在我的 ListView 中使用 Switch 组件来保持列表项的状态,无论它们是否被选中,但没办法。有没有人遇到同样的问题并应用了 NativeScript-Vue 文章中的解决方案?

【问题讨论】:

【参考方案1】:

实际上很容易修复。由于列表视图重用组件,我们不应该在组件本身内部设置数据。我们应该做的是添加/更改数组中对象内的数据,以便列表视图可以正确更新项目。

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

<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>

你也可以去掉这个开关,在listview上添加一个itemTap,然后在list中设置数据:

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

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

【讨论】:

我尝试了您的解决方案,但它不起作用,尤其是当我尝试使用“checkedChange”事件更新状态时。因为当我滚动列表时,许多 Switch 元素会触发“checkedChange”事件,并且应用程序会尝试通过对支持的 apiCalls 进行更新来更新列表元素状态。于是,一切都乱了套。我不明白他们为什么会触发“checkedChange”事件。因为在我看来,他们应该只在用户点击它时触发该事件。否则完全没用。所以,我放弃了使用“checkedChange”并使用了“tap”事件。现在一切正常。 @kempo 哦,我明白了,我认为这是因为布尔值是由 ListView 设置的,因此每当列表中可见新项目时它应该触发 checkChange(被重用,因此重置所有变量) . @kempo 我编辑了答案以解释 checkedChange 问题。既然它对您有用,您能否检查我的答案对于可能与您有相同问题的未来用户是否正确? 其实暂时不方便尝试,因为需要用到switch组件,这部分我已经完成了。如果您给我一个带有开关组件的解决方案,我很乐意尝试。 @kempo 再次编辑答案请检查这是否适合您。

以上是关于在 NativeScript-Vue ListView 中管理组件状态的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Nativescript-Vue 中使用 nativescript-drawingpad?

在 Nativescript-Vue 中使用 FontAwesome

在 nativescript-vue 的 FlexboxLayout 中将标签居中

如何更改 nativescript-vue 中的 RadDataForm 样式? (Nativescript-Vue)

NativeScript-vue 条码创建

Nativescript-Vue 每行两列