| <template> | 
|   <section class="todoapp"> | 
|     <!-- header --> | 
|     <header class="header"> | 
|       <input class="new-todo" auto-complete="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> |