结合localStorage 来双向绑定数据(超级神奇)

vue 结合localStorage 来双向绑定数据_双向绑定

 

localStorage.js: 

const STORAGE_KEY = 'todos_vuejs'
export default {
  fetch () {
    return JSON.parse(window.localStorage.getItem(STORAGE_KEY) || '[]')
  },
  save (items) {
    window.localStorage.setItem(STORAGE_KEY, JSON.stringify(items))
  }
}

App.vue

打开Chrome浏览器控制台找到"Application - Storage - Local Storage",观察变化

<template>
  <div id="app">
     <h1>{{title}}</h1> <!-- <h1 v-text='title'></h1> -->
     <input type="text" v-model='newItem' @keyup.enter='addItem'>
     <ul>
       <li v-for='item in items' v-bind:class="{finished: item.isFinished}" v-on:click='toggleFinish(item)'>
         {{item.label}}
       </li>
     </ul>
  </div>
</template>

<script>
import Storage from './localStorage.js'
console.log(Storage)
export default {
  data () {
    return {
      title: 'Hello World!',
      items: Storage.fetch(),
      newItem: ''
    }
  },
  methods: {
    toggleFinish (item) {
      item.isFinished = !item.isFinished
    },
    addItem () {
      console.log(this.newItem)
      this.items.push({
        label: this.newItem,
        isFinished: false
      })
      this.newItem = ''
    }
  },
  watch: {
    items: {
      handler (items) {
        Storage.save(items)
      },
      deep: true
    }
  }
}
</script>

<style>
.finished{text-decoration: underline;}
html {height: 100%; }
body {display: flex; align-items: center; justify-content: center; height: 100%; }
#app {color: #2c3e50; margin-top: -100px; max-width: 600px; font-family: Source Sans Pro, Helvetica, sans-serif; text-align: center; }
#app a {color: #42b983; text-decoration: none; }
.logo {width: 100px; height: 100px }
</style>