| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 | <template>  <section class="todoapp">    <!-- header -->    <header class="header">      <input class="new-todo" autocomplete="off" placeholder="Todo List" @keyup.enter="addTodo">    </header>    <!-- main section -->    <section v-show="todos.length" class="main">      <input id="toggle-all" :checked="allChecked" class="toggle-all" type="checkbox" @change="toggleAll({ done: !allChecked })">      <label for="toggle-all" />      <ul class="todo-list">        <todo          v-for="(todo, index) in filteredTodos"          :key="index"          :todo="todo"          @toggleTodo="toggleTodo"          @editTodo="editTodo"          @deleteTodo="deleteTodo"        />      </ul>    </section>    <!-- footer -->    <footer v-show="todos.length" class="footer">      <span class="todo-count">        <strong>{{ remaining }}</strong>        {{ remaining | pluralize('item') }} left      </span>      <ul class="filters">        <li v-for="(val, key) in filters" :key="key">          <a :class="{ selected: visibility === key }" @click.prevent="visibility = key">{{ key | capitalize }}</a>        </li>      </ul>      <!-- <button class="clear-completed" v-show="todos.length > remaining" @click="clearCompleted">        Clear completed      </button> -->    </footer>  </section></template><script>import Todo from './Todo.vue'const STORAGE_KEY = 'todos'const filters = {  all: todos => todos,  active: todos => todos.filter(todo => !todo.done),  completed: todos => todos.filter(todo => todo.done)}const defalutList = [  { text: 'star this repository', done: false },  { text: 'fork this repository', done: false },  { text: 'follow author', done: false },  { text: 'vue-element-admin', done: true },  { text: 'vue', done: true },  { text: 'element-ui', done: true },  { text: 'axios', done: true },  { text: 'webpack', done: true }]export default {  components: { Todo },  filters: {    pluralize: (n, w) => n === 1 ? w : w + 's',    capitalize: s => s.charAt(0).toUpperCase() + s.slice(1)  },  data() {    return {      visibility: 'all',      filters,      // todos: JSON.parse(window.localStorage.getItem(STORAGE_KEY)) || defalutList      todos: defalutList    }  },  computed: {    allChecked() {      return this.todos.every(todo => todo.done)    },    filteredTodos() {      return filters[this.visibility](this.todos)    },    remaining() {      return this.todos.filter(todo => !todo.done).length    }  },  methods: {    setLocalStorage() {      window.localStorage.setItem(STORAGE_KEY, JSON.stringify(this.todos))    },    addTodo(e) {      const text = e.target.value      if (text.trim()) {        this.todos.push({          text,          done: false        })        this.setLocalStorage()      }      e.target.value = ''    },    toggleTodo(val) {      val.done = !val.done      this.setLocalStorage()    },    deleteTodo(todo) {      this.todos.splice(this.todos.indexOf(todo), 1)      this.setLocalStorage()    },    editTodo({ todo, value }) {      todo.text = value      this.setLocalStorage()    },    clearCompleted() {      this.todos = this.todos.filter(todo => !todo.done)      this.setLocalStorage()    },    toggleAll({ done }) {      this.todos.forEach(todo => {        todo.done = done        this.setLocalStorage()      })    }  }}</script><style lang="scss">  @import './index.scss';</style>
 |