原理:vue采用数据劫持结合发布者-订阅者模式的方法,经过Object.defineProperty()来劫持各个属性的setter、getter属性,若是数据变更的话,通知订阅者,触发更新回调函数,从新渲染视图。javascript
页面经过mapAction异步提交事件到action,action经过commit或者dispatch(异步)把对应的参数同步提交到mutation,mutation会修改state里面对应的值,最后经过getter把对应的值给抛出去,在页面的计算属性中经过mapGetter来动态获取state中的值。html
vuex有5种属性: State、Getter、Mutation、Action、Modulevue
State是存放数据的地方,相似一个仓库,特性就是当Mutation修改了State数据的时候,它会动态的去修改全部的调用这个变量的全部组件里面的值(如果store中的数据发生了变化,依赖这个数据的组件也会发生更新)java
getter用来获取数据,mapGetter通常在计算属性中使用node
action相似于Mutation。不一样在于react
一、Action提交的是Mutation而不是在于直接变动状态webpack
二、Action能够包含异步操做ios
vue组件通讯主要是指如下三类通讯:父子组件通讯、隔代组件通讯、兄弟组件通讯git
props向子组件传值,$emit父组件传值或方法web
若是在普通的元素DOM上适用,引用指向的是元素DOM,若是用在子组件上,引用指向组件实例。
children: 访问父/子实例
这种方法经过一个空的Vue实例做为中央事件总线(事件中心),用来触发事件和监听事件,从而实现任何组件之间的通讯,包括父子、隔代、兄弟组件
listeners 适用于隔代组件
"attrs":包含了父级做用域不被props识别(且获取)的特性绑定(class和style除外),当一个组件没有声明任何props时,这里会包含全部父级做用域的绑定(class和style除外),而且能够经过v-bind="attrs"传入组件内部,一般配合inheritattrs选项一块儿使用。 #listeners:包含父级做用域中的(不含.native修饰器的)v-on事假监听,它能够经过v-on="$listeners"传入内部组件
provide/inject 适用于隔代组件
祖先组件经过provider来提供变量,而后在子组件中经过inject来注入变量。provide/inject Api 主要解决了跨级组件间的通讯,不过它的使用场景,主要是在子组件获取上级组件的状态,跨级组件间创建了一种主动提供与依赖注入的关系。
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。每个 Vuex 应用的核心就是 store(仓库)。“store” 基本上就是一个容器,它包含着你的应用中大部分的状态 ( state )。 Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地获得高效更新。 改变 store 中的状态的惟一途径就是显式地提交 (commit) mutation。这样能够方便地跟踪每个状态的变化。
虚拟DOM其实就是一个javascript对象,经过这个Javascript对象来描述真是DOM
真实DOM操做,通常会对某块元素进行从新渲染
采用虚拟DOM的话,当数据发生变化的时候,字须要局部刷新变化的位子就行了。
虚拟DOM和真实DOM的区别
{
"name": "Hello World", // 项目名称.
"version": "0.0.1", //项目的版本号
"author": "张三", //项目的做者
"description": "第一个node.js程序", //项目的描述
"keywords": [ //关键字。方便使用者在 npm search中搜索。格式为字符串。
"node.js",
"javascript"
],
"repository": { //用于指示源代码存放的位置
"type": "git",
"url": "https://path/to/url"
},
"license": "MIT",
"engines": { //指明了该项目所须要的node.js版本
"node": "0.10.x"
},
"bugs": { //可选字段,文图追踪系统的URL或邮箱地址;npm bugs使用
"url": "http://path/to/bug",
"email": "bug@example.com"
},
"contributors": [ //项目的其余贡献者
{
"name": "李四",
"email": "lisi@example.com"
}
],
"scripts": { //指定了运行脚本命令的npm命令行缩写,使用scripts字段定义脚本命令。
"start": "node index.js"
},
"dependencies": { // 生产/开发环境依赖包列表
"express": "latest",
"mongoose": "~3.8.3",
"handlebars-runtime": "~1.0.12",
"express3-handlebars": "~0.5.0",
"MD5": "~1.2.0"
},
"devDependencies": { //指定项目开发所须要的模块。
"bower": "~1.2.8",
"grunt": "~0.4.1",
"grunt-contrib-concat": "~0.3.0",
"grunt-contrib-jshint": "~0.7.2",
"grunt-contrib-uglify": "~0.2.7",
"grunt-contrib-clean": "~0.5.0",
"browserify": "2.36.1",
"grunt-browserify": "~1.3.0",
}
}
复制代码
个人理解是:主张问题较少,没有那多的硬性要求。 每一个都会有本身的一些特色,从而对使用者有必定的要求,这些要求有强有弱。
好比,angular的两个版本都是强主张,若是你使用它,必须接受如下东西
好比react,,它也有必定程度的主张,它的主张主要是函数式编程的理念,好比说,你须要知道什么是反作用,什么是纯函数,如何隔离反作用。它的侵入性看似没有Angular那么强,主要由于它是软性侵入。
Vue可能有些方面是不如React,不如Angular,但它是渐进的,没有强主张,你能够在原有大系统的上面,把一两个组件改用它实现,当jQuery用;也能够整个用它全家桶开发,当Angular用;还能够用它的视图,搭配你本身设计的整个下层用。你能够在底层数据逻辑的地方用OO和设计模式的那套理念,也能够函数式,均可以,它只是个轻量视图而已,只作了本身该作的事,没有作不应作的事,仅此而已。
vue-cli提供了两种脚手架模板,webpack和webpack-simple
vue官方文档上说:咱们能够将同一个函数定义为方法而不是一个计算属性,两种方式的最终结果都是彻底相同的,不一样的是计算属性是基于他们的响应式依赖进行缓存的,只在相关响应式依赖发生变化时,他们才会从新求值,这就意味着只要message尚未发生变化,屡次访问reversedMessage计算属性会当即返回以前的计算结果,而没必要执行函数;
个人理解就是:当页面从新渲染的时候(不是刷新),计算属性不会发生变化,而是直接读取缓存使用,适合于大量的计算和改变频率较低的属性。
而methods,就是当页面从新渲染的时候,页面元素data发生变化,页面就会从新渲染,都是从新调用methods方法。
$.ajax({
method: "post",
url: url,
data: data,
dataType: dataType,
success; functon () {},
error: function() {}
})
复制代码
优缺点:
axios({
method: "post",
url: url,
data: {
message: '123'
}
}).then(res => {}).catch(err => {})
复制代码
优势:
tyu {
let response = await fetch(url)
let data = response.json()
console.log(data)
} catch (e) {
console.log('error')
}
复制代码
fetch是ajax的替代品,使用了ES6中Promise对象,fetch是基于promise设计的,fetch不是ajax的进一步封装,而是原生js,没有使用XMLHTTPRequest对象
优势:
vue中央事件总线eventBus的实质就是建立一个vue实例,经过一个空白的vue实例做为桥梁实现vue组件的通讯,它是实现非父子组件通讯的一种解决方案。
// 使用一个vue实例,做为事件载体,用于绑定事件和处理发送事件,做为调度中心
let eventBus = new Vue()
let one = {
template: '<div>{{ val }} <button @click="click">click</button></div>',
data() {
return {
val: 0
}
},
created() {
// 为one绑定事件,若是tow_click事件发生了改变,则执行改变函数
eventBus.$on('two_click',
(val) => {
// 这个this 指的是one的vue实例
this.val = val
}
)
},
methods: {
click() {
// 若是one被点击了,则发送一个one_click的事件,并传递一个参数
eventBus.$emit('one_click', 11)
}
}
}
let two = {
template: '<div>{{val}} <button @click="click">click</button></div>',
data() {
return {
val: 0
}
},
created() {
eventBus.$on('one_click',
(val) => {
this.val = val
})
},
methods: {
click() {
eventBus.$emit('two_click', 22)
}
}
}
new Vue({
el: '#app',
components: {
one,
two
}
})
复制代码
MVVM是Model-View-ViewModel的简写,即模型-视图-视图模型,【模型】指的是后端传递的数据,【视图】指的是所看到的页面,【视图模型】MVVM的核心,它是连接model和view的桥梁,它有两个方向:一是将【模型】转化为【视图】,即将后端传递的数据转化为所看到的页面,实现的方式是数据绑定,二是将【视图】转化为【模型】,即将所看到的页面转化为后端数据。实现的方式是DOM监听。这两个方向都实现咱们称之为数据的双向绑定。
npm run xxx是运行package.json里面的script命令
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"build": "node build/build.js"
},
复制代码
这里运行了build/webpack.dev.conf.js文件