Cached Getters - simple

by Michael Gallagher

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.7/vue.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuex/3.1.0/vuex.min.js"></script>
<script src="https://unpkg.com/vue-pursue@0.1.3/dist/vue-pursue.js"></script>
<script type="text/x-template" id="comp">
  <div>{{ task.name }}<br/>
    <pre>{{ Date.now() }}</pre>
  </div>
</script>


<div id="app" />
<div class="output" />

JavaScript

const store = new Vuex.Store({
  state: {
    tasks: {
      1: { id: 1, name: 'Setup' },
      2: { id: 2, name: 'Impl' },
      3: { id: 3, name: 'Testing' },
    },
  },
  getters: {
    mappedTask: (state) => (id) => ({
      name: state.tasks[id].name.toUpperCase(), 
    }),
    mappedTask2: (state, getters) => {
      const cache = {};
      return (id) => {
        const record = state.tasks[id];
        const key = id + record.name;
        if (!cache[key]) {
          cache[key] = getters.mappedTask(id);
        }
        return cache[key];
      };
    },
  },
  mutations: {
    changeOne: (state) => {
      state.tasks[1].name = 'Preparation';
    },
  },
});

const comp = {
  props: ['task'],
  template: '#comp',
}

new Vue({
  store,
  el: '#app',
  components: {
    Comp: comp
  },
  computed: {
    mappedTasks() {
      return Object.keys(this.$store.state.tasks)
       .map(this.$store.getters.mappedTask2);
    },
  },
  template: '<div><Comp v-for="task in mappedTasks" :task="task" :key="task.id"/></div>',
  mounted() {
    setTimeout(() => {
      this.$store.commit('changeOne');
    }, 3000);
  }
})