Vue.js备忘记录(一) 概述 安装 vue对象 生命周期 语法 数据绑定 事件处理

介绍 — Vue.js

vscode必装插件:vuetr 和 Vue 2 snippets

Vue.js备忘记录(一) 概述 安装 vue对象 生命周期 语法 数据绑定 事件处理_第1张图片
image
Vue.js备忘记录(一) 概述 安装 vue对象 生命周期 语法 数据绑定 事件处理_第2张图片
image

为了方便调试,我们还应该安装官方浏览器插件devtools

https://github.com/vuejs/vue-devtools​github.com

安装要翻墙,安装好后进入调试工具,找vue标签

小贴士合集:

  • 每个 Vue 应用都是通过用Vue函数创建一个新的Vue 实例开始的

  • 只有当实例被创建时就已经存在于data中的属性才是响应式的。

  • 不要在选项属性或回调上使用箭头函数 (this问题)

  • v-on: 可以缩写为 @

  • v-bind: 可以缩写为 :

  • v-bind:class指令也可以与普通的 class 属性共存。

  • 不推荐同时使用v-if和v-for

  • 将计算属性computed里的函数取名为名词,当属性来调用

  • 组件中使用v-for时,key属性是必须的

  • key必须使用v-bind来绑定,key必须是string或者number

  • v-on绑定的方法如果有参数,必须传参

  • 为了与ES6风格统一,v-for="value in object"也可以写成v-for="value of object"

  • 注册自定义组件时不建议使用驼峰命名法,驼峰命名法会自动转为 - 命名法

  • 组件里的data必须是传入一个function,function里面再return对象出来

  • 子组件props里的数据不要和子组件的表单做双向数据绑定!

  • 最好不要在插槽上绑定vue指令,可以在其外面包一个div绑上

一. 概述

1.单页面应用程序 SPA

  • 经典的多页面: 不同页面都是独立的页面(有利于搜索引擎,前后端融合)

  • 现代式的单页面:不同网页其实是一个页面,只是在刷新区别内容 (只需要加载局部视图,用户体验好,不好兼容到低版本IE,所以诞生了一堆的开发框架,前后端分离,没有服务端渲染,服务端不再关心视图)

例如:https://music.163.com/ 不管页面怎么刷新,上面的导航条和下面的音乐播放条都不会刷新

2. 多页面的价值 //以服务端为主导,前后端混合

  • 以服务端为主

  • 有利于搜索引擎SEO

3.单页面的价值 //前后端分离

  • 前后端分离,前后端通过接口交互,服务端不关心页面

  • 不好兼容到低版本IE

  • 没有服务端渲染

  • 单页是肯定要使用框架的,比如 ract vue

4.前后端分离

项目立项

需求分析

服务端工作:

  • 需求分析

  • 设计数据库

  • 接口设计(前端也参与)

  • 数据处理及接口开发

前端工作

  • 需求分析

  • 页面搭建

  • 页面功能制作

  • 通过接口和服务器进行交互

5. vue简介

vue可以轻松构建SPA

通过指令扩展了HTML,通过 表达式 绑定数据到HTML

最大程度的解放DOM操作

vue特性:

  • MVVM

  • 双向数据绑定

  • 组件化

  • 渐进式

  • Vue不支持IE8 及以下版本

6.MVC和MVVM的概念

mvc是后端分层的概念 m 数据库层 v 视图层 c控制层

MVVM是前端视图层的概念,主要关注于 模型 视图模型 视图

Vue.js备忘记录(一) 概述 安装 vue对象 生命周期 语法 数据绑定 事件处理_第3张图片
image

二. vue的安装和hello world

1.安装




也可以指定版本(推荐生产环境这样用)




还没有npm下载


$ cnpm install vue --save

2. hello world






    
    
    Document



    

{{ 1+2 }}

{{ 'hello world'}}

{{message}}

{{lolo}}

Vue.js备忘记录(一) 概述 安装 vue对象 生命周期 语法 数据绑定 事件处理_第4张图片
image
  • 在此,我们可以先把vue看作一个模板引擎,

  • data中的数据不是一般的数据,而是响应式数据,

  • 响应式数据是一种数据驱动视图的思想,MVVM

  • el不要作用在html或body节点上

3. vue对象和其选项

(1) vue对象

每个 Vue 应用都是通过用Vue函数创建一个新的Vue 实例开始的

(2) data属性 (Vue的选项)

data其实Vue对象的一个属性,我们也可以称之为Vue的选项,那么vue有多少选项呢?

我们简单的看一下API就知道了

API — Vue.js

Vue.js备忘记录(一) 概述 安装 vue对象 生命周期 语法 数据绑定 事件处理_第5张图片
image
Vue.js备忘记录(一) 概述 安装 vue对象 生命周期 语法 数据绑定 事件处理_第6张图片
image
Vue.js备忘记录(一) 概述 安装 vue对象 生命周期 语法 数据绑定 事件处理_第7张图片
image
Vue.js备忘记录(一) 概述 安装 vue对象 生命周期 语法 数据绑定 事件处理_第8张图片
image

目前,我们只看最常用的选项.

当一个 Vue 实例被创建时,它将data对象中的所有的属性加入到 Vue 的响应式系统中。当这些属性的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。当这些数据改变时,视图会进行重渲染。

值得注意的是只有当实例被创建时就已经存在于 data 中的属性才是响应式的。也就是说如果你添加一个新的属性,比如:


vm.b = 'hi'

那么对 b 的改动将不会触发任何视图的更新。如果你知道你会在晚些时候需要一个属性,但是一开始它为空或不存在,那么你仅需要设置一些初始值。

除了数据属性,Vue 实例还暴露了一些有用的实例属性与方法。它们都有前缀 $,以便与用户定义的属性区分开来。例如:


var data = { a: 1 }
var vm = new Vue({
  el: '#example',
  data: data
})

vm.$data === data // => true
vm.$el === document.getElementById('example') // => true

// $watch 是一个实例方法
vm.$watch('a', function (newValue, oldValue) {
  // 这个回调将在 `vm.a` 改变后调用
})

(3) methods

v-on 引用的函数都写在这个集合里

methods 将被混入到 Vue 实例中。可以直接通过 VM 实例访问这些方法,或者在指令表达式中使用。方法中的this自动绑定为 Vue 实例。

(4) computed 计算属性

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。

这时候我们用到计算属性,他算是一种带有计算行为的属性,我们应该把他当作属性来调用

computed里的内容实质是方法,但不能当方法来调用,相较于方法,其特点是可以缓存计算结果

建议computed里的函数取名为名词,当属性来调用

例如:


{{ message.split('').reverse().join('') }}

但当计算复杂度高的时候,我们可以封装计算过程


"{{ reversed }}"

const app = new Vue({ el: '#app', data: { message:'hello world' }, computed:{ reversed:function(){ return this.message.split('').reverse().join('') } } })

双向绑定计算属性

每个计算属性其实都可以有自己的get和set属性. 如果设置了这两个属性,那么计算属性既可以get取值也可以set传值 (a=计算属性 计算属性=a)

只是默认只有 getter ,当你为其传入一个函数时,getter会接收它, 除非......

不过在需要时你也可以提供一个 setter :

computed: {
  fullName: {
    // getter
    get: function () {
      return this.firstName + ' ' + this.lastName
    },
    // setter
    set: function (newValue) {
      var names = newValue.split(' ')
      this.firstName = names[0]
      this.lastName = names[names.length - 1]
    }
  }
}
现在再运行 vm.fullName = 'John Doe' 时,setter 会被调用,vm.firstName 和 vm.lastName 
也会相应地被更新。

如果有一个计算属性是既可以get又可以set的,那么它完全可以双向绑定

例子:

image

如果我们想实现上图中的 全选联动 可以



    computed: {
        allDone:{
            get:function(){
                return this.todos.every(todo=>todo.done==true)
            },
            set:function(value){
                todos.forEach(todo => {
                    todo.done=value
                });
            }
        }

v-model绑定计算属性allDone, 这样就完成了联动,

当我们点击下面的按钮时,会改变this.todos.every(...)的值,这个值会通过计算属性allDone的getter改变顶部checkbox的勾选状态.

同时,我们点击checkbox改变勾选状态时,会触发allDone的setter 从而改变下面的todo的done状态

使用计算属性实现过滤

data: { todos: JSON.parse(window.localStorage.getItem('todos') || '[]'), filterText: 'all' }, computed: { filterTodos() { switch (this.filterText) { case 'done': return this.todos.filter(todo => todo.done) break; case 'undone': return this.todos.filter(todo => !todo.done) break; default: return this.todos break; } } },

(5) watch 侦听属性 //用来监听属性的变化

Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性。

计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。

下例会侦听message的数据变化并触发方法

watch默认又两个参数;可以直接在函数中接收

  • newValue 属性的新值

  • oldValue 属性的旧值





    
    
    Document



    

深度监视

watch监视对象只能监视一层,如果对象中还有子对象,则需要使用深度监视

如下面的例子C

var vm = new Vue({
  data: {
    a: 1,
    b: 2,
    c: 3,
    d: 4,
    e: {
      f: {
        g: 5
      }
    }
  },
  watch: {
    a: function (val, oldVal) {
      console.log('new: %s, old: %s', val, oldVal)
    },
    // 方法名
    b: 'someMethod',
    // 该回调会在任何被侦听的对象的 property 改变时被调用,不论其被嵌套多深
    c: {
      handler: function (val, oldVal) { /* ... */ },
      deep: true
    },
    // 该回调将会在侦听开始之后被立即调用
    d: {
      handler: 'someMethod',
      immediate: true
    },
    e: [
      'handle1',
      function handle2 (val, oldVal) { /* ... */ },
      {
        handler: function handle3 (val, oldVal) { /* ... */ },
        /* ... */
      }
    ],
    // watch vm.e.f's value: {g: 5}
    'e.f': function (val, oldVal) { /* ... */ }
  }
})
vm.a = 2 // => new: 2, old: 1

(6) filters 过滤器

详见本系列第四篇第一节

(7) directives 自定义私有指令

详见本系列第三篇第一节

三. 生命周期函数

vue对象的生命周期:

Vue.js备忘记录(一) 概述 安装 vue对象 生命周期 语法 数据绑定 事件处理_第9张图片
image

1.创建期间的钩子函数

(1) beforeCreated

vue对象创建完成时触发, 还不能访问data和methods

(2)created

vue对象初始化完成时触发

created钩子可以用来在一个实例被创建之后执行代码 可以访问data和methods了

(3) beforeMounted

模板编译完成,在内存中,还没有挂载到页面中去时触发 //{{msg}}还是花括号

(4) mounted

模板编译完成,挂载到了页面中去时触发 //{{msg}}已经被替换成了this.msg的内容

2. 运行期间的钩子函数

(1)beforeUpdated

data数据改变,渲染到页面之前触发

(2)updated

data数据改变并渲染到页面之后触发

3. 销毁阶段

(1)beforeDestroyed

(2)destroyed

四. vue基本语法

1.条件

(1) v-if

v-if指令用于条件性地渲染一块内容。


现在你看到我了

var app3 = new Vue({ el: '#app-3', data: { seen: true } })

也可以用v-else添加一个“else 块”:


Vue is awesome!

Oh no

还有v-else-if,顾名思义,充当v-if的“else-if 块”,可以连续使用

(2) 如何一次性判断多个元素?

因为v-if是一个指令,所以必须将它添加到一个元素上。但是如果想切换多个元素呢?此时可以把一个