Управление состоянием компонента в NativeScript-Vue ListView

У меня проблемы с управлением состоянием компонентов в NativeScript-Vue ListView. У меня точно такая же проблема, описанная в следующей статье: https://www.nativescript.org/blog/managing-component-state-in-nativescript-listview. В статье не объясняется решение для Nativescript-Vue. Я использую компоненты Switch в моем ListView, чтобы сохранить состояние элементов списка, выбраны они или нет, но никак. Кто-нибудь сталкивался с такой же проблемой и применял решение из статьи для NativeScript-Vue?


person kempo    schedule 19.08.2019    source источник


Ответы (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 for="item in array" @itemTap="itemTapped">

itemTapped(evt) {
    this.array[evt.index].VARIABLE = true/false;
}
person Mennolp    schedule 20.08.2019
comment
Я попробовал ваше решение, и оно не сработало, особенно когда я пытаюсь обновить статус с помощью события checkedChange. Потому что, когда я прокручиваю список, многие элементы Switch запускают событие checkedChange, и приложение пытается обновить статус элементов списка, создавая apiCalls для резервного копирования. Итак, все напортачило. Я не понял, почему они запускают событие checkChange. Потому что, на мой взгляд, они должны запускать это событие только тогда, когда пользователь нажимает на него. В противном случае это совершенно бесполезно. Итак, я отказался от использования checkedChange и использовал событие касания. Теперь все работает как положено. - person kempo; 21.08.2019
comment
@kempo О, я вижу хммм, я думаю, это потому, что логическое значение устанавливается ListView, и поэтому оно должно запускать checkChange каждый раз, когда в списке отображается новый элемент (при повторном использовании сбрасываются все переменные). - person Mennolp; 21.08.2019
comment
@kempo Я отредактировал ответ, чтобы объяснить проблему checkedChange. Поскольку он работает для вас, не могли бы вы проверить мой ответ как правильный для будущих пользователей, у которых может быть такая же проблема, как и у вас? - person Mennolp; 22.08.2019
comment
На самом деле сейчас непросто попробовать, потому что мне нужно использовать компонент switch, и я закончил эту часть. Если вы дадите мне решение с переключателем, я буду благодарен за попытку. - person kempo; 22.08.2019
comment
@kempo Снова отредактировал ответ, пожалуйста, проверьте, работает ли это для вас. - person Mennolp; 26.08.2019