2017-10-05 11 views
0

これは可能かどうかわかりませんが、同じリストに投稿する複数の入力フィールドを持つVueアプリケーションで作業しています。これを何らかの形で保存する必要があるため、サイトでは、入力フィールドの出力が保存されます。複数の入力を持つVueアプリケーションのLocalStorage

これは、taskListとsubTaskListの両方の配列を保存する必要があることを意味しています(私はtaskListのみで作業していました)。

私がここに投稿した例は、データを細かく保存しますが、リフレッシュすると、すべてのコンポーネントのすべてのデータがポストされます。これを修正して正しいコンポーネントのみにすることができますか?

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>

明確にするために、私は例が付属しています:それは今あるように私は、「初日」のコンポーネントに「foo」と「bar」を投稿し、リフレッシュした場合、 ページでは、 "Foo"と "Bar"を "Day One"と "Day Two"の両方に投稿します。 本質的に、 "Foo"を "Day One"、 "Bar"を "Day Two"にポストし、そこから "Hello World"をショッピングリストに投稿すると、すべて保存されたいどこにでもすべてを投稿するのではなく、適切な場所に配置してください。

ところで、私はバックエンドの作業では擦っています。今newTasktaskListnewSubTasksubTaskListは、すべてのコンポーネントとVueのインスタンス内のデータとして利用可能である

import persistentStorage from 'vue-persistent-storage'; 

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

答えて

0

グローバルな状態を持続するには、次のようなプラグインvue-persistent-stateを使用することができます。変更はlocalStorageに保存され、バニラビューアプリの場合のようにthis.taskListなどを使用できます。

あなたのリストのコンポーネントは現在、次のようになります。

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); 
    }, 
    }, 
}); 

あなたは、これがどのように動作するかを理解したい場合は、the codeは非常に単純です。それは基本的に

  1. すべてのVueのインスタンス、および変更して保存彼らのために
  2. 時計にinitialStateを利用できるようにするmixinを追加します。

免責事項:私はvue-persistent-stateの著者です。

関連する問題