RadListView for Vue - Getting started
RadListView
for Vue is exposed through the
RadListViewComponent
class. This article will guide you through the process of adding
a
RadListViewComponent
in your application, binding it to a data-source and visualizing
the items by using an item template of your choice. For more
information on how each separate feature of
RadListViewComponent
is used, please refer to the dedicated articles which are using
the same scenario and extend it further.
Installation
Run the following command to add the plugin to your application:
tns plugin add nativescript-ui-listview
Adding a RadListView to your Vue app
The first step is installing the Vue plugin for
RadListView
integration, adding that fragment in
the top of the main file entry (usually main.js
or
main.ts
):
import Vue from 'nativescript-vue';
import RadListView from 'nativescript-ui-listview/vue';
Vue.use(RadListView);
To add an instance of
RadListViewComponent
in an Vue template you need to use the
<RadListView></RadListView>
tag. You
will also need to bind the control to a source of items and
define an item template which will determine how each business
object from the source collection will be visualized. The
following Vue instance demonstrates this:
export default {
name: 'GettingStarted',
description: description,
template: `
<Page>
<ActionBar :title="title">
<NavigationButton text="Back" android.systemIcon="ic_menu_back" @tap="onNavigationButtonTap"></NavigationButton>
</ActionBar>
<StackLayout>
<RadListView ref="listView"
for="item in itemList"
@itemTap="onItemTap">
<v-template>
<StackLayout class="item" orientation="vertical">
<Label :text="item.name" class="nameLabel"></Label>
<Label :text="item.description" class="descriptionLabel"></Label>
</StackLayout>
</v-template>
</RadListView>
</StackLayout>
</Page>
`,
data() {
return {
title: description,
itemList: getItemList(10),
};
},
methods: {
onItemTap({ item }) {
console.log(`Tapped on ${item.name}`);
},
onNavigationButtonTap() {
Frame.topmost().goBack();
}
}
};
Using ObservableArray
There are some caveats as the inner
RadListView
object does not know about Vue and does
not observe the re-active Vue data. So, in order to fix the
problem and update the list if some item changes, the Vue plugin
does automatically refresh the control entirely if it detects
any changes on the list.
This may cause some minor UI issues as scrolling to the first position when list changes, and this may not be a desired behavior.
If you want to get rid of this minor caveats, you can use
ObservableArray
instead of regular arrays. Using an
ObservableArray instance as a source for
RadListView
will ensure that changes in the source
collection will be automatically taken care of by the control
The previous code would be like this:
import { ObservableArray } from 'tns-core-modules/data/observable-array';
export default {
template: `
<Page>
<StackLayout>
<RadListView ref="listView"
for="item in itemList"
@itemTap="onItemTap">
<v-template>
<StackLayout orientation="vertical">
<Label :text="item.name"></Label>
<Label :text="item.description"></Label>
</StackLayout>
</v-template>
</RadListView>
</StackLayout>
</Page>
`,
data() {
return {
itemList: new ObservableArray([
{name: 'Item 1', description: 'Item 1 description'},
{name: 'Item 2', description: 'Item 2 description'},
{name: 'Item 3', description: 'Item 3 description'},
]),
};
},
methods: {
onItemTap({ item }) {
console.log(`Tapped on ${item.name}`);
},
}
};
References
Related articles you might find useful: