Skip to content

Commit ef26448

Browse files
committed
fix: proper v-model for tab-view
fix nativescript-vue#50
1 parent 2ddd253 commit ef26448

File tree

3 files changed

+30
-25
lines changed

3 files changed

+30
-25
lines changed

platform/nativescript/compiler/directives/model.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@ import { addHandler, addAttr } from 'compiler/helpers'
22
import { genComponentModel, genAssignmentCode } from 'compiler/directives/model'
33
import { getViewMeta } from '../../element-registry'
44

5-
const valueTypes = ['text', 'value', 'checked', 'date', 'selectedIndex', 'time']
6-
75
export default function model(el, dir, _warn) {
8-
if (el.type === 1) {
6+
if (el.type === 1 && el.plain) {
97
genDefaultModel(el, dir.value, dir.modifiers)
108
} else {
119
genComponentModel(el, dir.value, dir.modifiers)

platform/nativescript/runtime/components/tab-view.js

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,37 @@
11
export default {
22
name: 'tab-view',
33

4-
props: ['selectedTab'],
5-
6-
template: `
7-
<native-tab-view ref="tabView" v-model="selectedIndex">
8-
<slot></slot>
9-
</native-tab-view>
10-
`,
4+
model: {
5+
prop: 'tab',
6+
event: 'tabChange'
7+
},
118

12-
data() {
13-
return {
14-
selectedIndex: 0
9+
props: {
10+
tab: {
11+
type: Number,
12+
default: 0
1513
}
1614
},
1715

18-
watch: {
19-
selectedTab(index) {
20-
this.selectedIndex = index
21-
},
22-
selectedIndex(index) {
23-
this.$emit('tabChange', index)
24-
}
16+
render(h) {
17+
return h(
18+
'native-tab-view',
19+
{
20+
ref: 'tabView',
21+
on: {
22+
selectedIndexChange: ({ value }) => this.$emit('tabChange', value)
23+
},
24+
attrs: {
25+
selectedIndex: this.$props.tab
26+
}
27+
},
28+
this.$slots.default
29+
)
2530
},
2631

2732
methods: {
2833
registerTab(tabView) {
29-
let items = this.$refs.tabView.nativeView.items || []
34+
const items = this.$refs.tabView.nativeView.items || []
3035

3136
this.$refs.tabView.setAttribute('items', items.concat([tabView]))
3237
}

samples/app/app-with-tab-view.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
const Vue = require('./nativescript-vue')
2-
2+
Vue.config.debug = true
33
let app = new Vue({
44
data: {
5-
selectedTab: 0,
5+
activeTab: 1,
66
tabs: [
77
{ title: 'First Tab', text: 'im the first tab' },
88
{ title: 'Second Tab', text: 'im the second tab' },
@@ -24,9 +24,11 @@ let app = new Vue({
2424
</stack-layout>
2525
</action-bar>
2626
<stack-layout>
27+
<Label :text="activeTab"/>
2728
<button @tap="tabs.push({title: 'added', text: 'added tab'})">Click me!</button>
28-
<tab-view :selectedIndex="selectedTab">
29-
<tab-view-item v-for="(tab, i) in tabs" key="i" :title="tab.title">
29+
<button @tap="activeTab = tabs.length - 1">Go to last!</button>
30+
<tab-view v-model="activeTab">
31+
<tab-view-item v-for="(tab, i) in tabs" :key="i + tab.title" :title="tab.title">
3032
<label>{{ tab.text }}</label>
3133
</tab-view-item>
3234
</tab-view>

0 commit comments

Comments
 (0)