2017-10-05 1 views
0

Je ne sais pas si c'est possible - mais je travaille sur une application Vue avec plusieurs champs de saisie qui publie dans la même liste - et j'ai besoin que cela soit stocké d'une manière ou d'une autre le site, les sorties des champs de saisie sont sauvegardées. Cela signifie que le tableau taskList et le tableau subTaskList doivent être sauvegardés (je sais que j'ai seulement travaillé sur taskList).LocalStorage dans Vue App avec plusieurs entrées

L'exemple que j'ai posté ici enregistre les données correctement, mais si vous actualisez, il affichera toutes les données dans tous les composants, cela peut-il être réparé afin qu'il ne soit que dans les bons composants?

const STORAGE_KEY = 'madplan-storage' 
 

 
Vue.component('list-component', { 
 
      data: function() { 
 
       return { 
 
        newTask: "", 
 
        taskList: [], 
 
        newSubTask: "", 
 
        subTaskList: [], 
 
       }; 
 
      }, 
 

 
      created() { 
 
       this.taskList = JSON.parse(localStorage.getItem(STORAGE_KEY) || '[]'); 
 
      }, 
 

 
      template: 
 
       '<div>' + 
 

 
       '<section class="prefetch">' + 
 
       '<input v-if="showInput" class="input typeahead" type="text" placeholder="Tilføj ret til madplanen" v-model="newTask" v-on:keyup.enter="addTask">' + 
 
       '</section>' + 
 

 
       '<details open v-for="task in taskList" v-bind:key="task.text" class="sub-list-item">' + 
 
       '<summary>{{ task.text }}<i class="fa fa-times" aria-hidden="true" v-on:click="removeTask(task)"></i>' + '</summary>' + 
 
       '<input class="subInput" type="text" placeholder="Tilføj til indøbsseddel" v-model="newSubTask" v-on:keyup.enter="addSubTask">' + 
 
       '</details>' + 
 

 
       '</div>', 
 

 
      computed: { 
 
       showInput: function() { 
 
        return !this.taskList.length 
 
       }, 
 
      }, 
 

 
      methods: { 
 
       //addTasks 
 
       // 
 
       addTask: function() { 
 
        var task = this.newTask.trim(); 
 
        if (task) { 
 
         this.taskList.push({ 
 
          text: task 
 
         }); 
 
         this.newTask = ""; 
 
         localStorage.setItem(STORAGE_KEY, JSON.stringify(this.taskList)); 
 
        } 
 
       }, 
 

 
       addSubTask: function() { 
 
        var task = this.newSubTask.trim(); 
 
        if (task) { 
 
         this.subTaskList.push({ 
 
          text: task 
 
         }); 
 
         this.newSubTask = ""; 
 
         this.$emit('addedtask', task); 
 
         localStorage.setItem(STORAGE_KEY, JSON.stringify(this.subTaskList)); 
 
        } 
 
       }, 
 

 
       //removeTasks 
 
       // 
 
       removeTask: function(task) { 
 
        var index = this.taskList.indexOf(task); 
 
        this.taskList.splice(index, 1); 
 
       }, 
 
      }, 
 
     }); 
 

 

 

 
     new Vue({ 
 
      el: "#madplan", 
 
      data: { 
 
       newTask: "", 
 
       taskList: [], 
 
       newSubTask: "", 
 
       subTaskList: [], 
 
      }, 
 
      methods: { 
 
       acknowledgeAddedTask: function(cls, task) { 
 
       this.$data.subTaskList.push({ 
 
       \t text: task, 
 
        class: "list-item " + cls 
 
        }) 
 
       }, 
 
       acknowledgeRemovedTask: function(task) { 
 
       this.$data.subTaskList = this.$data.subTaskList.filter(it => it.text != task.text) 
 
       }, 
 
       removeSubTask: function(task) { 
 
        var index = this.subTaskList.indexOf(task); 
 
        this.subTaskList.splice(index, 1); 
 
       }, 
 
      } 
 
     });
<section id="madplan" class="section-wrapper"> 
 

 
     <section class="check-list"> 
 
      <div id="mandag" class="dayWrapper"> 
 
      <h1>Day One</h1> 
 
      <list-component 
 
       class="mandag" 
 
       v-on:addedtask='task => acknowledgeAddedTask("mandag", task)' 
 
      ></list-component> 
 
      </div> 
 

 
      <div id="tirsdag" class="dayWrapper"> 
 
      <h1>Day Two</h1> 
 
      <list-component 
 
       class="tirsdag" 
 
       v-on:addedtask='task => acknowledgeAddedTask("tirsdag", task)' 
 
      ></list-component> 
 
      </div> 
 
      
 
     <ul id="indkobsseddel"> 
 
      <h2>Shopping List</h2> 
 
      <li v-for="task in subTaskList" v-bind:key="task.text" :class="task.class">{{ task.text }}<i class="fa fa-times" aria-hidden="true" v-on:click="removeSubTask(task)"></i></li> 
 
     </ul> 
 

 
    </section> 
 
     
 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
 
    <script src="https://unpkg.com/vue/dist/vue.js" charset="utf-8"></script>

Pour être clair, je viendrai avec un exemple: Comme il est maintenant, si je poste « Foo » et « Bar » à la « Day One » composant et actualiser la page, il affichera ensuite "Foo" et "Bar" à la fois "Day One" et "Day Two". Essentiellement, je voudrais être en mesure de poster un exemple "Foo" à "Day One", "Bar" à "Day Two" et à partir de là, poster "Hello World" à la liste d'achats, et tout serait enregistré dans les bons endroits, au lieu de poster tout partout.

BTW: Je suis un gommage au travail de backend.

Répondre

0

Persister état global, vous pouvez utiliser le plugin vue-persistent-state comme ceci:

import persistentStorage from 'vue-persistent-storage'; 

const initialState = { 
    newTask: "", 
    taskList: [], 
    newSubTask: "", 
    subTaskList: [],  
}; 
Vue.use(persistentStorage, initialState); 

Maintenant newTask, taskList, newSubTask et subTaskList est disponible sous forme de données dans tous les composants et les instances Vue. Tous les changements seront stockés dans localStorage, et vous pouvez utiliser this.taskList etc. comme vous le feriez dans une application Vue vanille.

Votre composant liste devient maintenant:

Vue.component('list-component', { 
    // data removed 
    // created removed 

    template: 
    '<div>' + 

    '<section class="prefetch">' + 
    '<input v-if="showInput" class="input typeahead" type="text" placeholder="Tilføj ret til madplanen" v-model="newTask" v-on:keyup.enter="addTask">' + 
    '</section>' + 

    '<details open v-for="task in taskList" v-bind:key="task.text" class="sub-list-item">' + 
    '<summary>{{ task.text }}<i class="fa fa-times" aria-hidden="true" v-on:click="removeTask(task)"></i>' + '</summary>' + 
    '<input class="subInput" type="text" placeholder="Tilføj til indøbsseddel" v-model="newSubTask" v-on:keyup.enter="addSubTask">' + 
    '</details>' + 

    '</div>', 

    computed: { 
    showInput: function() { 
     return !this.taskList.length 
    }, 
    }, 

    methods: { 
    //addTasks 
    // 
    addTask: function() { 
     var task = this.newTask.trim(); 
     if (task) { 
     this.taskList.push({ 
      text: task 
     }); 
     this.newTask = ""; 
     // localStorage.setItem not needed 
     } 
    }, 

    addSubTask: function() { 
     var task = this.newSubTask.trim(); 
     if (task) { 
     this.subTaskList.push({ 
      text: task 
     }); 
     this.newSubTask = ""; 
     // $emit not needed, state is global and shared 
     // localStorage.setItem not needed 
     } 
    }, 

    //removeTasks 
    // 
    removeTask: function(task) { 
     var index = this.taskList.indexOf(task); 
     this.taskList.splice(index, 1); 
    }, 
    }, 
}); 

Si vous voulez comprendre comment cela fonctionne, the code est assez simple. Il essentiellement

  1. ajoute un mixin pour faire initialState disponible dans tous les cas Vue et
  2. montres pour les changements et les stocke.

Responsabilité: Je suis l'auteur de vue-persistent-state.