VUE

一、相对于其他框架相比

1、相对于Angular

    1.1、相对于angular的api,vue的api更简单,上手容易,学习成本相对低

    1.2、angular使用双向绑定,但是vue也支持双向绑定,不过为单项数据流,数据从父组件单行传给子组件

    1.3、相对于angular,vue中指令和组件分的更清晰一些

    1.4、angular脏检查机制会造成项目庞大后性能降低的问题,导致每一次更新都会使所有的数据绑定进行一次遍历,vue的数据变化更新是根据依赖追踪的观察系统并且一部队列去更新,数据变化都是独立的出发队列中相应的事件

    1.5、vue渲染层创建了虚拟Dom,减少了内存开销和加快了渲染速度

    1.6、vue是组件式开发,每个组件都具有生命周期,便于自己状态的维护,实现了代码的高复用性

注: (1)、vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现(从页面操作可以实时反映导数据)

(2)、单向数据流是使用两个数据流(上传、下传)进行双向数据通信,但是两个数据流之间相互独立,其只能从一个方向来修改状态

(3)、指令只封装Dom操作,组件代表一个自给自足的独立单元

(4)、脏检查机制是$watch()监听数据变化,$digest()循环遍历每一个watch对象,然后实例化

(5)、虚拟Dom其实是一个Obj,就是通过Obj的方式来表示Dom结构

2、相对于React

    2.1、react和vue都提供了 Virtual DOM(虚拟Dom),提供了响应式(Reactive:响应式编程)和组件化(Composable)的试图组件

    2.2、将注意力集中保持在核心库,而将其他功能如路由和全局状态管理交给相关的库

    2.3、vue的更新渲染过程是自动追踪的,而react如果想要提高更新的性能需要通过shouldComponentUpdate钩子函数对数据进行对比

    2.4、对于组件的语法,在vue中既可以支持jsx语法,将css和html都写入js文件中,又可以使用template模板进行编译,在vue中推荐使用template模板进行编译,减少学习成本,更加符合前端开发语法;而react仅仅支持jsx语法,jsx的优点:一、开发工具对jsx的支持比其他的vue模板更先进

    2.5、对于css的支持:vue中可以直接在style中写css语法,可以支持媒体查询,等等一切css属性,并且可以通过scoped进行组件作用域的封闭;react的组件中如果进行css样式的隔离,只能写入js文件中,比较简单的样式可以进行支持,但是如果比较复杂的则无法支持

    2.6、都提供了路由和状态管理机制而且都有自己的自动化构建工具,react的学习成本比较高,需要掌握jsx语法和es2015;虽然支持前端babel进行编译,但是不适合生产环境。vue向下扩展可以像jq那样使用在前端项目中,向上扩展可以像react一样进行前端的自动化构建

 总结:(1)、MVVM的开发模式,从dom中解脱出来,双向数据绑定

(2)、数据更新采用异步事件机制

(3)、采用单向数据流

(4)、组件式开发

(5)、采用虚拟Dom

(6)、支持模板和jsx两种开发模式

(7)、可以进行服务端渲染

(8)、扩展性强,既可以向上又可以向


二、安装与使用

    1、直接使用CDN引入

        

    2、下载到本地

        https://vuejs.org/js/vue.js

    3、自动化构建工具:Vue.js官方的脚手架生成工具 vue-cli

        3.1、全局安装:npm install –g vue-cli

        3.2、创建项目:vue init webpack myproject

        3.3、安装依赖包:npm install

    4、vue-cli目录

        4.1、build: 用于存放 webpack 相关配置和脚本

        4.2、config: 主要存放配置文件,用于区分开发环境、测试环境、线上环境的不同

        4.3、src: 项目源码及需要引用的资源文件

        4.4、static: 不需要 webpack 处理的静态资源

        4.5、test: 用于存放测试文件

    5、启动服务

        正常开发时,就会运行命令npm run dev,启动一个小型的express 服务。在这个 express 服务中,会使用webpack-dev-middleware 和 webpack-hot-middleware 这两个 中间件,来进行项目的热部署,即每次修改 src 中的文件后,不需要再按浏览器的刷新来更新 代码,启动的 server 服务会自动监听文件的变化并编译,通知浏览器自动刷新

    6、分析packjson文件

        6.1、dev:为本地开发的启动项

        6.2、start:和dev一样

        6.3、build:打包线上部署代码

        6.4、e2e:这个代表端对端测试,确切的来说就是前端的一个自动化测试;这里使用的是java的nightwatch自动化测试工具,使用测试需要进行java的全局安装

 "scripts": {

    "dev": "node build/dev-server.js",

    "start": "node build/dev-server.js --open",

    "build": "node build/build.js",

    "e2e": "node test/e2e/runner.js",

    "test": "npm run e2e",

    "lint": "eslint --ext .js,.vue src test/e2e/specs"

 }

    7、实例

        7.1、一个 Vue 实例其实正是一个 MVVM 模式中所描述的 ViewModel - 因此在文档中经常会使用 vm 这个变量名

        7.2、在实例化 Vue 时,需要传入一个选项对象,它可以包含数据、模板、挂载元素、方法、生命周期钩子等选项

    8、模板

        8.1、三个属性:template、el、replace(2.0)已经删除,规定template中必须有个根节点

        8.2、Replace:为true时不会保留原dom节点,直接将原节点替换,如果是false则,保留原节点

    9、数据

        9.1 、可以对外部数据进行代理,外部传入的数据如果为对象,对此数据进行的浅拷贝,此时我们成为数据的响应式

        9.2、对于初始化后,进行的数据添加无效,要想对于初始后添加的数据生效,需要使用$set(),不过不推荐这么,尽量在数据初始化时,就对所有需要的数据进行添加,可以用undefined和null进行占位

        9.3、$watch方法对于实例对象的数据进行监听,并在回掉中接受旧数据和新数据     

    10、方法

        10.1、Methods对象来定义方法,并且使用v-on指令来监听DOM事件

        10.2、自定义事件:$emit、$on、($broadcast、$dispatch在2.0中已经删除)

    11、生命周期

        在vue实例创建时一系列的初始化步骤:beforeCreate、created、beforeMount、mounted、beforeDestroy、destroyed 、beforeUpdate、updated、activated、deactivated

    12、数据绑定

        12.1、传统的web项目,往往是通过后端模板引擎来进行数据和视图的渲染,例如:php的smarty、java的velocity、node的express、也就是传统的服务端渲染,导致前后端语言混杂在一起,造成渲染后期进行视图更改是,只能通过dom

        12.2、文本插值使用{{}}大括号,单次赋值:{{*}}   (2.0中使用v-once=””)

        12.3、属性插值{{}}   (2.0 v-bind:id=””)

        12.4、表达式{{}}

    13、指令

        参数:v-bind:src=”attr”,给属性绑定值,或者可以这样写:src=”{{attr}}”,或者可以这样写 :src=“attr”,v-on

    14、计算属性(三种对于数据变化监听机制)

        14.1、computed:一个属性依赖于多个属性时,推荐使用

        14.2、watch():多个属性依赖一个属性是,推荐使用

        14.3、Set、get:set对一个属性设置值时,会自动的调用相应的回掉函数,get的回调函数会根据,函数内部依赖的属性的改变而自动改变

    15、条件渲染

        15.1、v-if、v-else-if(多次进行链式的使用)v-else

        15.2、template v-if 如果在一个判断中要对多个元素进行渲染,则需要配合template标签;

        15.3、key管理可复用的元素Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染,在这里用key进行元素的唯一标识赋值,降低元素的复用性

        15.4、v-if与v-showv-if 是“真正的”条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销

        15.5、v-if与v-for一起使用:当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级;如果想让v-if优先级更高,则需要在外套一层标签;进行v-if的渲染

    16、列表渲染

        16.1、常用写法:v-for="item in items"      v-for="(item,index) in items"    v-for="(value, key, index) in object"(遍历对象)

        16.2、结合template使用:带有 v-for 的