Vue.js 3.x快速入门
上QQ阅读APP看书,第一时间看更新

2.2.4 JS代码部分

注释如下所示。

<script type="text/javascript">
window.onload=function(){
  // 下面的代码,表示使用了浏览器的 localStorage进行存储。同时定义了fetch()和save()
  // 用来方便操作
  var STORAGE_KEY = 'todos-vuejs'
  var todoStorage = {
    fetch: function () {
      var todos = JSON.parse(localStorage.getItem(STORAGE_KEY) || '[]')
      todos.forEach(function (todo, index) {
        todo.id = index
      })
      todoStorage.uid = todos.length
      return todos
    },
    save: function (todos) {
      localStorage.setItem(STORAGE_KEY, JSON.stringify(todos))
    }
  }
  // 定义过滤器,可以分别对 ative、completed和 all进行过滤
  var filters = {
    all: function (todos) {
      return todos
    },
    active: function (todos) {
      return todos.filter(function (todo) {
        return !todo.completed
      })
    },
    completed: function (todos) {
      return todos.filter(function (todo) {
        return todo.completed
      })
    }
  }
 
  // 创建Vue的实例(instance)
  var app = Vue.createApp({
    // 设置页面用到的各种变量
    data() {
      return {
        todos: todoStorage.fetch(),
        newTodo: '',
        editedTodo: null,
        visibility: 'all'
      }
    },
 
    // 监听变量的修改
    watch: {
      todos: {
        handler: function (todos) {
          todoStorage.save(todos)
        },
        deep: true
      }
    },
    // 定义computed properties
    computed: {
      filteredTodos: function () {
        return filters[this.visibility](this.todos)
      },
      remaining: function () {
        return filters.active(this.todos).length
      },
      allDone: {
        get: function () {
          return this.remaining === 0
        },
        set: function (value) {
          this.todos.forEach(function (todo) {
            todo.completed = value
          })
        }
      }
    },
 
    // 定义各种方法
    // 实现对于待办事项的增加、删除和修改
    // 注意,这里没有任何直接操作HTML DOM的代码
    methods: {
      // 新增待办事项
      addTodo: function () {
        var value = this.newTodo && this.newTodo.trim()
        if (!value) {
          return
        }
        this.todos.push({
          id: todoStorage.uid++,
          title: value,
          completed: false
        })
        this.newTodo = ''
      },
      // 删除待办事项
      removeTodo: function (todo) {
        this.todos.splice(this.todos.indexOf(todo), 1)
      },
      // 编辑待办事项
      editTodo: function (todo) {
        this.beforeEditCache = todo.title
        this.editedTodo = todo
      },
      // 把待办事项标记为:已完成
      doneEdit: function (todo) {
        if (!this.editedTodo) {
          return
        }
        this.editedTodo = null
        todo.title = todo.title.trim()
        if (!todo.title) {
          this.removeTodo(todo)
        }
      },
      // 取消编辑
      cancelEdit: function (todo) {
        this.editedTodo = null
        todo.title = this.beforeEditCache
      },
 
    },
    // 使用了自定义的Directive,也就是HTML中的<todo-focus>
    directives: {
      'todo-focus': function (el, binding) {
        if (binding.value) {
          el.focus()
        }
      }
    }
  })
  // 最后,使用Vue.js 渲染整个页面
  app.mount('.todoapp')
}
</script>

该例子总共178行,代码精炼、功能齐备。可以看出,使用Vue.js做开发的效率非常高。

但是,一旦项目的需求增加,代码也会越来越膨胀,把HTML、JavaScript和CSS代码都写在一个文件中并不合适,所以需要以一种更好的形式来组织文件,这就是Webpack框架下的Vue.js。