MVC:
Model(模型)
View(视图)
Controller(控制器)
简单的理解:视图请求数据,将请求发送至控制器,控制器再将请求发送给模型,模型去查找数据,找到之后传给控制器,控制器再传给视图进行渲染。
MVP:
MVVM
Model 代表数据模型
View 代表UI视图
ViewModel 负责监听 Model 中数据的改变并且控制视图的更新(桥梁,可以理解成mvc中的控制器)
简单理解:视图请求数据,将请求发送至控制器,在控制器的两端具有监听机制,直接调用模型的数据,一端改变全部改变,利用数据劫持,结合订阅者和发布者模式,实现数据的双向绑定
虚拟dom是利用js描述元素与元素的关系。
好处:是可以快速的渲染和高效的更新元素,提高浏览器的性能
diff算法
优点:最终表现在DOM上的修改只是部分的变更,可以保证高效的渲染,提高网页的性能
缺点:首次渲染大量DOM时,由于多了一层虚拟DOM的计算,会比innerHtml慢一点
new Vue({
el: "#app",
data:{
},
methods:{
}
})
v-html 解析输出变量 能解析html
v-text 解析输出变量
v-bind 给标签绑定属性 可以简写为 :属性名=“变量”
v-on 给元素绑定事件 用法 v-on:事件名=“方法名” 可以简写为@事件名=“方法”
v-pre 跨过当前的标签不解析 用法 :<标签 v-pre>标签>
v-cloak 解决差值表达式闪烁的问题
v-model 实现数据的双向绑定 只能适用于表单元素
v-for 可以循环遍历数据
v-if 条件输出
v-show条件输出
.stop 阻止事件冒泡
.capture 设置事件捕获
.self 只有当事件作用在元素本身才会触发
.prevent 阻止默认事件,比如超链接跳转
.once 事件只能触发一次
.keyup.enter
.keyup.space
区别:
1、当条件为真的时候 没有区别 当条件为假的时候 v-if是不创建元素 v-show 渲染元素然后隐藏掉
2、v-if更适合数据的筛选和初始渲染 v-show更适合元素的切换
绑定:
v-bind:属性名=“变量” :属性名=“变量”
语法:@事件名.修饰符=“方法名”
.stop 阻止事件冒泡
.capture -事件捕获
.self 只是监听触发改元素的事件
.once - 只触发一次
.prevent - 阻止默认事件
methods是没有缓存的,只要调用,就会执行
computed具有缓存性,依赖于属性值,只有属性发生改变的时候才会重新调用
watch没有缓存性 监听属性 属性值只要发生变化就会执行 可以利用他的特性做一些异步的操作
<标签 v-bind:class="{类名:变量}">
过滤器是实现变量的格式化输出 。过滤器分为局部过滤器还有全局过滤器
全局过滤器 是在多个实例中可以使用的过滤器
语法:
Vue.filter(“名”,function(value){
// value是调用过滤器的属性的值
})
调用:
在v-bind中或者{ { 属性|过滤器名}}
局部过滤器 只是在当前的组件或者实例中使用
filters:{
名:function(val){
}
}
注意:过滤器可以串联 但是后面的肯定是以前面的为基础
Vue是一个MVVM的渐进式框架,,渐进式指的是先使用Vue的核心库,然后再根据需求逐渐增加所需要的插件,慢慢的组织成自己的项目,我们在使用过程中主张最小化,Vue没有强主张,插件使用比较灵活,也就是没有做职责之外的事。
vue中的v-model可以实现双向绑定,其核心思想通过Object.definePropery来对Vue的数据进行数据劫持
主要分为三部分
observer主要是负责对Vue数据进行数据劫持,使其数据拥有get和set方法
指令解析器负责绑定数据和指令,绑定试图更新方法
watcher负责数据监听,当数据发生改变通知订阅者,调用视图更新函数更新视图
单页面应用:
优点:跳转速度快
缺点:首屏加载慢
多页面应用:
有点:首屏加载快
缺点:跳转的效率不高
v-cloak 解决差值表达式闪烁的问题
特性:重用性,可指定性,互操作性,高内聚性,低耦合度
好处:组件可以拓展HTML元素、封装可重用代码
一个vue页面主要包括3个部分:界面展示代码template、业务实现代码script、界面布局代码style
Bus.$emit(“事件名”,"参数")
来派发事件,数据是以$emit()的参数形式来传递Boolean 布尔
String 字符串
Number 数字
Array 数组
Function 函数
Object 对象
Symbol
keep-alive是vue提供给我们的一个组件,用来在路由切换的时候保存我们的组件状态
当我们在切换路由需要保存失活组件的状态的时候需要用到,比如我浏览淘宝滑动的中间位置,然后又去购物车页面,再回到首页的时候能够保存住我刚才滑动的位置
1. 全局保存在App.vue中 把routerView保存起来
2. 部分缓存
1、router.js中设置要缓存的页面
{
path: '/child1',
name: 'Child1',
component: Child1,
meta:{
keepAlive:true
}
}
},
2、用v-if来显示router-view是否在keep-alive中出现
1.创建
beforeCreate() 在执行这个钩子的时候 只有一些实例本身的事件和生命周期函数 用户自定义不能使用
created() 最早开始使用 data和methods中数据的钩子
2.挂载
beforeMount() 指令已经解析完毕 内存中已经生成dom数
mounted()dom已经渲染完毕 页面和内存的数据已经同步
3.更新
beforeUpdate() 当data的数据发生改变会执行这个钩子 内存中数据是新的 页面是旧的
updated() 内存和页面都是新的
4.销毁
beforeDestroy()即将销毁 data和methods中的数据此时还是可以使用的,可以做一些释放内存的操作
destroyed()已经销毁完毕
activated(组件激活时):和上面的beforeDestroy和destroyed用法差不多,但是如果我们需要一个实例,在销毁后再次出现的话,用 beforeDestroy和destroyed的话,就太浪费性能了。实例被激活时使用,用于重复激活一个实例的时候
deactivated(组件未激活时):实例没有被激活时。
errorCaptured(错误调用):当捕获一个来自后代组件的错误时被调用
created()是最早使用data中数据的钩子函数
mounted()是最早可以操作dom元素的钩子函数
vue init webpack mypro
cd mypro
cnpm install
npm run dev
vue脚手架指的是vue-cli,它是一个专门为单页面应用快速搭建繁杂项目的脚手架
vue脚手架的作用是用来自动一键生成vue+webpack的项目模版,包括依赖库,免去你手动安装各种插件,寻找各种cdn并一个个引入的麻烦
cnpm install node-sass --save
cnpm install [email protected] --save
标签使用
npm run build -环境 -域名 -打包文件夹 -平台
打包后会生成一个dist文件夹
在打包之前,需要将文件中config文件夹下的index.js中的 assetsPublicPath:"" 中的 / 改为 ./
history模式 hash模式 默认 hash模式
this.$route.query.name和this.$route.params.name
redirect属性
assets目录中文件在打包的时候会进行打包压缩然后上传到打包好的目录
static目录中的文件直接拷贝到打包好的目录中 不会进行压缩
{
path:"",
name:"",
compoent: ()=>{},
children:[
{
子路由配置
}
]
}
路由钩子函数有三种分别为 全局守卫 单个路由守卫 组件内部守卫
全局守卫钩子 beforeEach
单个路由守卫 beforeEnter
组件内部守卫
beforeRouteEnter
beforeRouteUpdate
beforeRouteLeave
to 对象 去哪儿
from 对象 从哪来
next 函数 next()==next(true) 继续执行
不写next==next(false)终止执行
next(path)跳转
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储和管理程序的所有组件的数据
在大型的程序中如果多个组件中用到的数据我们可以存储到vuex,如果小型项目我们可以适当的使用vuex
state 存储数据 在组件中的使用 this.$store.state.属性名
mutations 直接操作state中的数据 在组件中的使用 this.$store.commit("方法名",参数)
actions 可以实现异步操作 在actions中操作mutations中的数据 在组件使用 this.$store.dispatch("方法名",参数)
getters getters类似于计算属性可以对state中数据进行逻辑计算 在组件中 this.$store.getters.方法名
modules 将state分模块
在组件中通过dispatch来调用actions中的方法在actions中通过commit来调用mutations中的方法,在mutations中可以直接操作state中的数据,state的数据只要一发生改变立马响应到组件中
在vue的组件中通过dispatch来调用actions中的方法,在actions中通过commit来调用mutations中的方法,在mutations可以直接操作state中的数据,state中数据只要发生改变就立马会响应到组件中
cnpm install axios --save
main.js 中配置
import axios from "axios"
Vue.prototype.$axios = axios;
get方法 ,post方法, all() 方法
axios我们可以通过all方法完成并发请求,
在 .then中通过axios.spread拿到all中请求回来数据,在进行数据操作即可
import axios from "axios"
var instance=axios.create({
baseUrl: "",
timeout: 3000
})
拦截器axios发送出去请求或者数据响应回来赋值之前进行数据的拦截或者过滤
主要有请求拦截器 请求发送出去之前拦截
instance.interceptors.response.use(
config=>{
return config
}
)
响应拦截器 数据响应回来赋值之前拦截
instance.interceptors.response.use(
res=>{
return res
}
)
完整引入
在 main.js 中写入以下内容:
import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);
按需引入
import { 组件名 } from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(组件名);
参数:{Function}[callback]
用法:将回调延迟到下次DOM更新循环之后执行。在修改数据之后立即使用它,然后等待DOM更新。它跟全局方法Vue.nextTick一样,不同的是回调的this自动绑定到调用它的实例上。
this.nextTick(callback),当数据发生变化,更新后执行回调。
this.$nextTick(callback),当dom发生变化,更新后执行的回调。
fragment状态异常
错误原因:
activity已经不存在,还在commit,造成状态异常
commit(); commitallowstateslos();
错误发生处
OthersHomeActivity2 line438
MainActivity line156
BaseActivity onbackpressed
修复过程commit改为commitallowstateslos()