vue.js - 组件上触发代码 v-show=true

标签 vue.js

我使用的是 Vue 1.0。

  1. 我有一个带有选项卡的用户界面。
  2. 在每个选项卡中,都有一个应加载自己的数据(通过 ajax)的组件。
  3. 我不想一次加载每个选项卡组件的数据。
  4. 我只想加载一次数据。

如果我在组件上使用 v-if 并将加载代码放在 read() 中,则每次选择选项卡时都会加载。这是因为 v-if 破坏并重新创建了组件。 v-if 是否有等效的 keep-alive 功能?

如果我使用 v-show,所有选项卡都会立即加载。当组件变得可见时是否有一个钩子(Hook)?

编辑:因为评论一直提到动态组件。我想强调的是我不能使用动态组件,因为选项卡需要不同的属性。

最佳答案

您可以将v-ifv-show 一起使用。当激活选项卡时,您可以在其上设置绑定(bind)到 v-if 的属性。这使得选项卡加载。您无需取消设置该属性。

顶级属性跟踪当前显示的选项卡,并在 v-show 表达式中使用它。

在下面的示例中,每个选项卡在半秒延迟后启动时“加载”当前时间。当您在选项卡之间切换时,您会看到每个选项卡都保留自己的时间,不会在每次显示时重新加载。

var baseComponent = Vue.extend({
  data: function() {
    return {
      ajax: null
    }
  },
  created() {
    setTimeout(() => this.ajax = Date.now(), 500);
  }
});

Vue.component("tab-one", baseComponent.extend({
  template: `<div>Template for tab 1 {{ajax}}</div>`
}));

Vue.component("tab-two", baseComponent.extend({
  template: `<div>Template for tab 2 {{ajax}}</div>`
}));

Vue.component("tab-three", baseComponent.extend({
  template: `<div>Template for tab 3 {{ajax}}</div>`
}));

new Vue({
  el: '#app',
  data: {
    tabs: [{
        label: 'Tab 1',
        component: 'tab-one',
        wasLoaded: false
      },
      {
        label: 'Tab 2',
        component: 'tab-two',
        wasLoaded: false
      },
      {
        label: 'Tab 3',
        component: 'tab-three',
        wasLoaded: false
      }
    ],
    activeTab: null
  },
  methods: {
    activate: function(tab) {
      tab.wasLoaded = true;
      this.activeTab = tab;
    }
  }
});
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/1.0.10/vue.min.js"></script>
<div id="app">
  <div>
    <div class="tabs">
      <button v-for="tab in tabs" @click="activate(tab)">
        {{ tab.label }}
      </button>
      <tab-one v-if="tabs[0].wasLoaded" v-show="activeTab === tabs[0]"></tab-one>
      <tab-two v-if="tabs[1].wasLoaded" v-show="activeTab === tabs[1]"></tab-two>
      <tab-three v-if="tabs[2].wasLoaded" v-show="activeTab === tabs[2]"></tab-three>
    </div>
  </div>
</div>

关于vue.js - 组件上触发代码 v-show=true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42813594/

相关文章:

vue.js - 如何在带有 vue 的 web worker 中使用 axios?

javascript - 使用 Vue 2 和 JSX 绑定(bind)自定义事件

vue.js - 如何使用 Vuetify 数据表在鼠标悬停在表上时显示按钮

vue.js - Nuxt.config.js 不在 cwd 中

javascript - 如何对 Vuetify 日期范围选择器进行排序?

javascript - Vue js-当值达到0时隐藏减号按钮并取消隐藏加号按钮

php - 如何将Blade中的 bool 值传递给Vue组件Laravel 7?

vue.js - 未捕获( promise 中)在虚拟文件系统数据表中找不到文件 'Roboto-Regular.ttf' - vuejs

javascript - 对话框打开时在对话框内设置焦点文本字段

javascript - 为什么我必须从一个模块传播 Vuex getter,而不是从另一个模块传播 Vuex getter?