NativeScript-Vue 更新数据对象?

Posted

技术标签:

【中文标题】NativeScript-Vue 更新数据对象?【英文标题】:NativeScript-Vue Update Data Object? 【发布时间】:2019-08-10 07:09:52 【问题描述】:

是否可以使用新属性更新数据对象?

数据来自外部来源,而且数据不包含是否显示对象内容的标志。

<RadListView for="item in list" @itemTap="accordion">
    <v-template>
        <StackLayout>
            <Label :text="item.title" />
        </StackLayout>
        <StackLayout v-bind:>
            <Label :text="item.desc" />
        </StackLayout>
    </v-template>
</RadListView>
export default
    data()
        return
            list: [
                 "title" : "Sample Title", "desc" : "Lorem Ipsum" ,
                 "title" : "New Title", "desc" : "Test 123 Test" 
            ]
        
    ,
    methods: 
        accordion: function(e)
            e.item.toggled = !e.item.toggled;
        ,
        loadData: function() ... ,
        generateData: function( data ) ... 
    

所以“列表”对象不包含“toggled”属性,但我试图在用户单击 UI 中的项目时展开/折叠“desc”区域。

我的代码按原样返回 e.item.toggled,但 UI 没有更新undefined -&gt; true -&gt; false -&gt; true -&gt; false -&gt; ...

更新

根据@sundeqvist 的建议,我通过手风琴的方法传递了item 元素。

我还修改了如何将“toggled”属性修改为数据对象“list”。通过直接添加,控制台将值显示为真正的布尔值,而不是 Vue [Getter/Setter] 值。

<RadListView for="item in list">
    <v-template>
        <StackLayout @itemTap="accordion(item)">
            <Label :text="item.title" />
        </StackLayout>
        <StackLayout v-bind:>
            <Label :text="item.desc" />
        </StackLayout>
    </v-template>
</RadListView>
export default
    data()
        return
            list: [
                 "title" : "Sample Title", "desc" : "Lorem Ipsum" ,
                 "title" : "New Title", "desc" : "Test 123 Test" 
            ]
        
    ,
    methods: 
        accordion: function(item)
            item.toggled = !item.toggled;
        ,
        loadData: function() ... ,
        generateData: function( data )
            let dataArr = [];
            for( let d in data )
                d =  "toggled" : false, ...d ;
                dataArr.push( d );
            
            this.list = dataArr;
        
    

【问题讨论】:

【参考方案1】:

您确定在您的方法中访问item

通过将item 传递到您的手风琴方法调用中:

&lt;RadListView for="item in list" @itemTap="accordion(item)"&gt;

然后在您的方法中切换您作为参数传入的项目的toggle 属性:

accordion(item) 
  item.toggled = !item.toggled;

你应该能够让它工作。

【讨论】:

我认为你让我走对了路(尽管)我不确定这是否是正确的方式——我将 @itemTap="accordion(item)" 移动到 StackLayout 元素——以及代码在哪里摄取外部数据,而不是为对象分配属性,我做了一个传播"toggled" : false, ...data - 然后将“切换”到 vue [getter/setter] 看起来它正在工作,但控制台让它看起来像是在触发一个完全重新绘制? 重绘整个数组?听起来很奇怪……你解决了吗?如果你能扔出一个代码笔,我可以检查一下!

以上是关于NativeScript-Vue 更新数据对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 nativescript-vue 中列表项的颜色/背景颜色?

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

Nativescript-vue 获取有焦点的TextField

Nativescript-Vue中如何根据内容长度设置WebView的高度?

恢复后有时会在 Nativescript-Vue 上显示主屏幕

如何在 nativescript-vue 中使用 e2e 或单元测试?