У меня проблемы с управлением состоянием компонентов в NativeScript-Vue ListView. У меня точно такая же проблема, описанная в следующей статье: https://www.nativescript.org/blog/managing-component-state-in-nativescript-listview. В статье не объясняется решение для Nativescript-Vue. Я использую компоненты Switch в моем ListView, чтобы сохранить состояние элементов списка, выбраны они или нет, но никак. Кто-нибудь сталкивался с такой же проблемой и применял решение из статьи для NativeScript-Vue?
Управление состоянием компонента в NativeScript-Vue ListView
Ответы (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
Я попробовал ваше решение, и оно не сработало, особенно когда я пытаюсь обновить статус с помощью события checkedChange. Потому что, когда я прокручиваю список, многие элементы Switch запускают событие checkedChange, и приложение пытается обновить статус элементов списка, создавая apiCalls для резервного копирования. Итак, все напортачило. Я не понял, почему они запускают событие checkChange. Потому что, на мой взгляд, они должны запускать это событие только тогда, когда пользователь нажимает на него. В противном случае это совершенно бесполезно. Итак, я отказался от использования checkedChange и использовал событие касания. Теперь все работает как положено.
- person kempo; 21.08.2019
@kempo О, я вижу хммм, я думаю, это потому, что логическое значение устанавливается ListView, и поэтому оно должно запускать checkChange каждый раз, когда в списке отображается новый элемент (при повторном использовании сбрасываются все переменные).
- person Mennolp; 21.08.2019
@kempo Я отредактировал ответ, чтобы объяснить проблему checkedChange. Поскольку он работает для вас, не могли бы вы проверить мой ответ как правильный для будущих пользователей, у которых может быть такая же проблема, как и у вас?
- person Mennolp; 22.08.2019
На самом деле сейчас непросто попробовать, потому что мне нужно использовать компонент switch, и я закончил эту часть. Если вы дадите мне решение с переключателем, я буду благодарен за попытку.
- person kempo; 22.08.2019
@kempo Снова отредактировал ответ, пожалуйста, проверьте, работает ли это для вас.
- person Mennolp; 26.08.2019