基於Vue的TodoList示例,麻雀雖小,五臟俱全css
Vue + localStorage + hashhtml
添加備忘錄(輸入標題後回車添加,若是內容爲空或只有空格會清空,什麼都不添加)vue
刪除備忘錄(點擊標題後面的叉)git
完成備忘錄(點擊標題前面的複選框)github
編輯備忘錄(雙擊標題進入編輯模式)npm
取消編輯備忘錄(按ESC或者失去焦點時)vim
完成編輯備忘錄(按回車鍵完成[若是內容爲空的時候會自動刪除],此時也會調用到失去焦點事件)數組
一鍵完成全部備忘錄(點擊第一行的複選框)mvc
過濾任務,顯示所有,未完成,已完成的備忘錄(點擊所有,未完成,已完成按鈕)app
清空已完成備忘錄(點擊清空已完成)
npm init -y
npm i -S underscore vue todomvc-app-css
vim index.html
複製格式化後的html
引入css
將英文標題換成中文標題
引入vue.js
新建vue的實例
寫一個默認的任務:todoList: [{}]
// 新建一個Vue的實例對象 var todoapp = new Vue({ // 掛載 el: '.todoapp', // 數據 data: { // 備忘錄數組 todoList: [ // 一個任務就是一個對象,text表示任務的名稱,checked爲true表示已完成,false表示未完成 { text: '學Vue', checked: false }, { text: '學React', checked: false } ] }, 方法 methods: { }, // 計算屬性 computed: { } })
data: { newTodo: '', todos: todoStorage.fetch(), editedTodo: null, beforeEditCache: '', visibility }
computed: { //顯示任務總數量 showTodos() { return this.todos.length > 0 }, //未完成 activeCount() { return filters.active(this.todos).length }, //已完成 completedCount() { return filters.completed(this.todos).length }, //判斷全部任務 allDone: { get() { return this.activeCount === 0 }, set(value) { this.todos.map(todo => { todo.completed = value }) } }, //判斷 filteredTodos() { return filters[this.visibility](this.todos) } }
//store.js的判斷獲取 (function(){ var STORAGE_KEY = 'todos' window.todoStorage = { fetch() { try { return JSON.parse(localStorage.getItem(STORAGE_KEY) || '[]') } catch(err) { return []; } }, save(todos) { localStorage.setItem(STORAGE_KEY, JSON.stringify(todos)) } } })();
var filters = { all: todos => todos, active: todos => todos.filter(todo => !todo.completed), completed: todos => todos.filter(todo => todo.completed) } var visibility = location.hash.substr(location.hash.indexOf('/')+1) visibility = visibility === '' ? 'all' : visibility watch: { todos: { deep: true, handler: todoStorage.save//判斷當前應顯示的內容 } }
methods: { addTodo() { this.newTodo = this.newTodo.trim() if (!this.newTodo) { return } this.todos.unshift({ title: this.newTodo, completed: false }) this.newTodo = '' }, removeTodo(todo) { var index = this.todos.indexOf(todo) this.todos.splice(index, 1) }, editTodo(todo) { this.editedTodo = todo this.beforeEditCache = todo.title }, doneEdit(todo) { if (!this.editedTodo) { return; } this.editedTodo = null; todo.title = todo.title.trim() if (!todo.title) { this.removeTodo(todo) } }, cancelEdit(todo) { if (this.editedTodo) { todo.title = this.beforeEditCache this.editedTodo = null } }, removeCompleted() { this.todos = filters.active(this.todos) } }
directives: { focus: { update(el) { el.focus() } } }