【问题标题】:vuex load subcomponents on store state mutationvuex 在存储状态突变时加载子组件
【发布时间】:2018-05-24 07:21:01
【问题描述】:

我使用 vuex 来跟踪我的网格列表切换器按钮的状态。 每次选择视图类型时,我都想在模板之间切换,但这在我的情况下不起作用。这是模板

<div class="users-container">
    <div v-if="$store.state.view === 'list'">
        <h5>list</h5>
         <data-table :columns="columns" ajax="/api/v1/users/datatable"></data-table>
    </div>
    <div v-else>
        <h5>grid</h5>
        <data-grid :roles = "roles"></data-grid>
    </div>
</div>

如果我检查状态,一切都会完美更新,但不会发生切换。在这种情况下我做错了什么?

【问题讨论】:

标签: vuejs2 state store vuex


【解决方案1】:

尝试使用computed 属性来观察状态的变化。

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    view: 'list'
  },
  mutations: {
    CHANGE_VIEW (state, type) {
      state.view = type
    },
  }
});

Vue.component('list-view', {
  template: `
    <div>
      <h5>List</h5>
      <ul>
        <li v-for="item in dummyData">{{item}}</li>
      </ul>
    </div>
  `,
  data() {
    return {
      dummyData: [1, 2, 3, 4, 5]
    }
  }
})

Vue.component('grid-view', {
  template: `
    <div>
      <h5>Grid</h5>
      <table>
        <tr v-for="item in dummyData"><td>{{item}}</td></tr>
      </table>
    </div>
  `,
  data() {
    return {
      dummyData: [1, 2, 3, 4, 5]
    }
  }
})

const app = new Vue({
  el: '#app',
  store,
  data: {
    dummyData: [1, 2, 3, 4, 5]
  },
  computed: {
    view() { return this.$store.state.view }
  },
  methods: {
    changeView(type) {
      this.$store.commit('CHANGE_VIEW', type)
    }
  }
})
table {
    font-family: arial, sans-serif;
    border-collapse: collapse;
    width: 100%;
}

td, th {
    border: 1px solid #dddddd;
    text-align: left;
    padding: 8px;
}

tr:nth-child(even) {
    background-color: #dddddd;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.9/vue.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuex/3.0.1/vuex.min.js"></script>


<div id="app">
  <div class="control">
    <p>Change to:</p> 
    <button v-on:click="changeView('list')">List</button>
    <button v-on:click="changeView('grid')">Grid</button>
  </div>
  <div class="users-container">
    <div v-if="view === 'list'">
      <list-view></list-view>
    </div>
    <div v-else>
      <grid-view></grid-view>
    </div>
  </div>
</div>

【讨论】:

  • 感谢反馈,问题是2个组件是从不同的来源渲染的,他们有自己的模板来渲染
  • data-tabledata-grid 中的两个组件? @fefe
  • 是的,每一个都结束,因为它会触发 ajax 来获取数据
  • 我觉得跟组件没什么关系,我已经编辑了sn-p用两个组件来演示。我可能错了,所以更多信息可能会很好。 @fefe
  • 感谢您的更新。是的,它似乎与问题有关。从网格到列表我可以毫无问题地切换。比从列表到网格停止工作。我的数据表组件使用 jquery 数据表,不会在视图更改时自行销毁
猜你喜欢
  • 2020-03-08
  • 2019-07-26
  • 2019-09-24
  • 2019-11-30
  • 2018-02-13
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多