【问题标题】:error on removing an object in list in vue在 vue 中删除列表中的对象时出错
【发布时间】:2019-02-28 11:02:26
【问题描述】:

我正在使用 vue.js 部署客户端应用程序。 在这个应用程序中,我有一些使用 v-for 呈现的选项卡。这个标签数组在 vuex 存储中是这样格式化的:

tabs: [
  {
    id: 1,
    title: 'first tab',
    number: '09389826331',
    accountName: 'DelirCo',
    contactName: 'PourTabarestani',
    startTime: '2019-02-25 15:11:30',
    endTime: '2019-02-25 18:04:10',
    duration: null,
    subject: '',
    description: ''
  },
  {
    id: 2,
    title: 'second tab',
    number: '09124578986',
    accountName: 'Cisco',
    accountGUID: '',
    contactName: 'Arcada',
    contactGUID: '',
    startTime: '2019-02-25 15:11:45',
    endTime: '2019-02-25 15:13:55',
    duration: null,
    subject: '',
    description: ''
  }
]

我正在使用 getter 将标签加载到我的 vuex 商店中,它使用以下模板呈现标签:

<template>
  <div id="Tabs">
    <vs-tabs color="#17a2b8" v-model="selectedTab">
      <vs-tab v-for="tab in tabs" :key="tab.id" :vs- 
        label="tab.title">
        <Tab :tab="tab"></Tab>
      </vs-tab>
    </vs-tabs>
  </div>
</template>

我正在使用 vuesax 组件来创建选项卡显示。 此列表中的每个对象都是我前端的一个选项卡,当我单击每个选项卡时会显示相关数据。 当我尝试显示选项卡甚至在数组中添加另一个对象时,它做得很好。 问题是当我尝试从该数组中删除某个项目时,内容会消失,但选项卡标题(我可以用它选择选项卡的按钮)仍保留在页面上。 我正在使用

state.tabs.splice(objectIndex, 1)
state.selectedTab -= 1

用于删除选项卡并将所选选项卡更改为前一个选项卡。 但正如我所说,标签的标题并没有像下图那样被删除:

当我单击该选项卡时,出现此错误:

webpack-internal:///./node_modules/vuesax/dist/vuesax.common.js:4408 Uncaught TypeError: Cannot set property 'invert' of undefined
at VueComponent.activeChild (webpack-internal:///./node_modules/vuesax/dist/vuesax.common.js:4408)
at click (webpack-internal:///./node_modules/vuesax/dist/vuesax.common.js:4127)
at invoker (webpack-internal:///./node_modules/vue/dist/vue.esm.js:2140)
at HTMLButtonElement.fn._withTask.fn._withTask (webpack-internal:///./node_modules/vue/dist/vue.esm.js:1925)

有人对这个问题有什么建议吗?

【问题讨论】:

  • 你能告诉我们你是如何渲染标签的吗?
  • 我已经添加了我的仪表板组件,我在其中呈现选项卡

标签: javascript vue.js web-applications


【解决方案1】:

您可以只为父元素添加一个键来强制重新渲染。

<div :key="forceRender">
    <vs-tabs :value="activeTab">
      <template v-for="item in items">
        <vs-tab :label="item.name" @click="onTabChange(item)">
          <div class="con-tab-ejemplo">
            <slot name="content"></slot>
          </div>
        </vs-tab>
      </template>
    </vs-tabs>
  </div>

然后在items 上添加一个观察者:

watch: {
  items (val) {
    this.forceRender += 1
  }
},

【讨论】:

  • 不敢相信我必须这样做。
【解决方案2】:

这似乎是vuesax 库的问题。 &lt;vs-tabs&gt; 组件不支持作为子组件动态添加/删除&lt;vs-tab&gt; 组件。

以下是 repo 中 vsTab.vue 文件的摘录:

mounted(){
  this.id = this.$parent.children.length
  this.$parent.children.push({
    label: this.vsLabel,
    icon: this.vsIcon,
    id: this.$parent.children.length,
    listeners: this.$listeners,
    attrs: this.$attrs
  })
}

&lt;vs-tab&gt; 组件被挂载时,它会将自己作为子组件添加到父组件 (&lt;vs-tabs&gt;),但在销毁时它不会将自己从该数组中移除。

你可以在他们的 GitHub 页面上打开一个问题,看看他们是否可以支持你想要的,或者你可以提交一个拉取请求。

【讨论】:

  • 谢谢伙计。非常感谢您的帮助。
猜你喜欢
  • 2021-08-27
  • 2017-01-23
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 2021-08-03
  • 2016-05-13
  • 2012-04-03
相关资源
最近更新 更多