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>
|