1. 父子通信:
props
,子向父是通过 events( $emit
)$parent
/ $children
);ref
也可以访问组件实例provide / inject API
;$attrs/$listeners
2. 兄弟通信: Bus
;Vuex
3. 跨级通信: Bus
;Vuex
;provide / inject API
、$attrs/$listeners
计算属性computed :
get
和一个set
方法,当数据变化时,调用set
方法。侦听属性watch:
immediate
:组件加载立即触发回调函数执行deep
: 深度监听,为了发现对象内部值的变化,复杂类型的数据时使用在JavaScript中如果两个实例引用同一个对象,当其中一个实例的属性发生改变时,另一个实例属性也随之改变,只有当两个实例拥有自己的作用域时,才不会相互干扰。
组件中的data
写成一个函数,数据以函数返回值的形式定义,这样***每次复用组件的时候,都会返回一份新的data***,相当于每个组件实例都有自己私有的数据空间,它们只负责各自维护的数据,不会造成混乱。如果单纯的写成对象形式,就是所有的组件实例共用了一个data,这样改一个全都改了。
基础优化
data
中的数据,data
中的数据都会增加getter
和setter
,会收集对应的watcher
v-if
和v-for
不能连用v-for
给每项元素绑定事件时使用事件代理SPA
页面采用keep-alive
缓存组件v-if
替代v-show
key
保证唯一SEO
优化
SSR
打包优化
Tree Shaking/Scope Hoisting
cdn
加载第三方模块happypack
splitChunks
抽离公共文件sourceMap
优化用户体验
PWA
vue采用数据劫持结合发布者-订阅者模式的方式,通过
Object.defineProperty()
来劫持各个属性的setter
&&getter
在数据变动时发布消息给订阅者,触发相应的监听回调。
setter
MVC:M:Model 数据层,V:View 视图层,C:Controller 控制层
MVC模式是单项绑定,即model绑定到view,当我们用js代码更新model时,view就会自动更新
model
负责数据保存,与后端数据进行同步controller
负责业务逻辑,根据用户行为对model数据进行修改view
负责视图展示,将model中的数据可视化出来MVP:M:Model 数据层,V:View 视图层,P:Presenter 控制层
MVP 架构模式是 MVC 的改良模式(改进 Controller, 把 Model 和 View 完全隔离开)
model
负责数据保存,与后端数据进行同步Presenter
负责和model及view进行双向交互view
负责视图展示,将model中的数据可视化出来MVVM:M:Model 数据层,V:View 视图层,VM:ViewModel 控制层
由 MVP 模式演变而来
model
负责数据保存,与后端数据进行同步viewModel
通过响应式机制自动响应Model数据变化,通过更新策略自动将数据变化转换为视图更新,通过事件监听响应View中用户交互修改的Model数据view
负责视图展示,将model中的数据可视化出来总结:
MVC
模式出现较早主要应用在后端,如Spring MVC
、ASP.NET
MVC
等,在前端领域的早期也有应用,如Backbone.js。它的*优点是分层清晰,缺点是数据流混乱,灵活性带来的维护性问题。MVP
模式在是MVC
的进化形式, Presenter作为中间层负责MV通信, 解决了两者耦合问题,但P层过于臃肿会导致维护问题。MVVM
模式在前端领域有广泛应用,它不仅解决MV耦合问题,还同时解决了维护两者映射关系的大量繁杂代码和DOM操作代码,在提高开发效率、可读性同时还保持了优越的性能表现。通过props
v-if
和 v-show
都可以动态地显示DOM元素手段:
v-if
是动态的向DOM树内添加或者删除DOM
元素;
v-show
是通过设置DOM元素的display
样式属性控制显隐;
编译过程:
v-if
切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件;
v-show
只是简单的基于css切换;
编译条件:
v-if
是惰性的,如果初始条件为假,则什么也不做;只有在条件第一次变为真时才开始局部编译(编译被缓存?编译被缓存后,然后再切换的时候进行局部卸载);
v-show
是在任何条件下,然后被缓存,而且DOM元素保留;
性能消耗:
v-if
有更高的切换消耗;
v-show
有更高的初始渲染消耗;
使用场景:
v-if
适合运营条件不大可能改变;
v-show
适合频繁切换。
生命周期函数(钩子函数):在生命周期特定的时间自动执行的函数
创建阶段:Create
beforeCreate()
:初始化完成,但未往实例添加属性
应用:可以在这加个 loading 事件
created()
:往实例添加属性完成,但 DOM 还未生成
应用:在这结束 loading,还做一些初始化,实现函数自执行
挂载阶段:Mount
beforeMount()
:可以获取节点,但数据未渲染
应用:在这发起 ajax 请求,拿回数据,配合路由钩子做一些事情
mounted()
:实例挂载到 DOM 完成
应用:节点操作
更新阶段:Update
beforeUpdate()
:数据有更新但未更新节点update()
:更新节点完毕销毁阶段:Destroy
beforeDestroy()
destroyed()
:执行 destroy()后,不会改变已生成的 DOM 节点,但后续就不再受 vue 控制了
应用:清除定时器、延迟器、取消 ajax 请求等
单向数据流:指数据的改变只能从一个方向修改
例:子组件不能直接改变父组件的传入的数据。但是如果父组件改变相应的数据,子组件的数据也会发生相应的改变。
双向数据绑定
由MVVM框架实现,MVVM的组成:View,ViewModel,Model。其中View 和 Model不能直接通信,要通过ViewModel来进行通信。
Model
部分数据发生改变时,由于vue中Data Binding将底层数据和Dom层进行了绑定,ViewModel
通知View
层更新视图View
数据发生变化也会同步到Model
中。View和Model之间的同步完全是自动的,不需要人手动的操作DOM。jquery:依赖DOM元素的值
Vue:是一个精简的MVVM
指令的注册方式分为两种:一是全局注册,二是局部注册。
Vue.directive('name', {`options`})
directives: {
'name': {`options`}
}
具体的实现方式
Vue 提供了自定义指令的几个钩子函数:
除
update
与componentUpdated
钩子函数之外,每个钩子函数都含有el
、binding
、vnode
这三个参数。
仅在update 和 componentUpdated 钩子中可用
管理可复用的元素:声明其中的可复用的元是完全独立的——不要复用它们”
给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素。
数据驱动、组件化
数据(model)改变 -> 视图(view)自动更新
Vue中,Directives对view进行了封装,当model里的数据发生变化时,Vue就会通过Directives指令去修改DOM。
同时也通过DOM Listener实现对视图view的监听,当DOM改变时,就会被监听到,实现model的改变,实现数据的双向绑定。
组件响应原理
Vue 遍历实例的 data选项所有的属性,使用 Object.defineProperty 把这些属性全部转为 getter/setter
组件化
实现了扩展HTML元素,封装可重用的代码
单页面应用(SPA)
指只有一个主页面的应用,浏览器一开始要加载所有必须的 html, js, css。所有的页面内容都包含在这个所谓的主页面中。
优点:
缺点:
多页面(MPA),就是指一个应用中有多个页面,页面跳转时是整页刷新。
$emit方法
在组件中的style标签里面加上scoped
使用Vue内置属性:$refs
用法:this.$refs.domName
v-model双向数据绑定;
v-for循环;
v-if / v-show 显示与隐藏;
v-on事件;
v-once: 只绑定一次。
使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点。
作用主要是为了高效的更新虚拟DOM。
主张最少;可以根据不同的需求选择不同的层级;
vue 双向数据绑定是通过
数据劫持
结合发布订阅模
式的方式来实现的, 也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变
Object.defineProperty()
方法。单页面应用(SPA)
指只有一个主页面的应用,浏览器一开始要加载所有必须的 html, js, css。所有的页面内容都包含在这个所谓的主页面中
但在写的时候,还是会分开写(页面片段),然后在交互的时候由路由程序动态载入,单页面的页面跳转,仅刷新局部资源。多应用于pc端。
多页面(MPA)
指一个应用中有多个页面,页面跳转时是整页刷新
v-if
与v-for
一起使用时,v-for
的优先级更高
不推荐v-if和v-for同时使用。如果v-if和v-for一起用的话,vue中的的会自动提示v-if应该放到外层去。
.stop
:防止事件冒泡,等同于JavaScript中的event.stopPropagation();.prevent
:防止执行预设的行为,等同于JavaScript中的event.preventDefault()(如果事件可取消,则取消该事件,而不停止事件的进一步传播);.capture
:与事件冒泡的方向相反,事件捕获由外到内;.self
:只会触发自己范围内的事件,不包含子元素;.once
:只会触发一次。
$router
: 是路由操作对象,只写对象
$route
: 路由信息对象,只读对象
query可以使用
name
来传参,也可以使用path
//query传参,使用name跳转
this.$router.push({
name:'xxx',
query: {
id:'20180822',
}
})
//query传参,使用path跳转
this.$router.push({
path:'/xxx',
query: {
id:'20180822',
}
})
//query传参接收
this.$route.query.id;
params传参只能使用
name
进行引入
//路由格式
{
path: '/xxx/:id',
name: 'xxx',
component: () => import('@/view/xxx')
//params传参 使用name
this.$router.push({
name:'xxx',
params: {
id:'20180822',
}
})
//params接收参数
this.$route.params.id ;
当一个属性受多个属性影响的时候就需要用到computed
最典型的栗子: 购物车商品结算的时候
当一条数据影响多条数据的时候就需要用watch
栗子:搜索数据
使用:axios
可以, 在v-on中使用{ }:
。
1. vue-loader是webpack的加载器,允许以单文件组件(SFC)的格式创作Vue组件
2. 允许对Vue组件的每个部分使用其他webpack加载器
3. 允许.vue文件中的自定义块可以应用自定义加载程序链,简单来说就是可以解析.vue文件
4. 处理在模块依赖项中引用的静态资源
5. 模拟每个组件的范围CSS
6. 在开发过程中保持热加载(同步更新)
当你修改了
data
里的值然后马上获取这个dom元素的值,是不能获取到更新后的值
需要使用$nextTick
这个回调,让修改后的data值渲染更新到dom元素之后在获取,才能成功。
插槽
solt
:父组件的数据和子组件进行内容互相传递的工具
父组件 -> 子组件:插槽
使用 slot 插槽标签,可以使用父组件传来的内容进行展示,至于在哪里展示 由子组件决定
子组件 -> 父组件:作用域插槽
使用slot-scope 进行数据的传递,父组件引用子组件中的数据
子组件在
里定义数据:
父组件使用
接收数据
scope:保存 xxx 插槽中 props 数据
assets和static两个都是存放静态资源文件。项目中所需要的资源文件图片、字体图标、样式文件等都可以放在这两个文件下。
区别:
assets
:在项目打包时,会将assets中放置的静态资源文件进行打包上传,所谓打包简单点可以理解为压缩体积,代码格式化。而压缩后的静态资源文件最终也都会放置在static文件中跟着index.html一同上传至服务器。static
:不会打包压缩格式化等,而是直接进入打包好的目录,直接上传至服务器。建议:将项目中template需要的样式文件js文件等都可以放置在assets中,走打包这一流程。减少体积。而项目中引入的第三方的资源文件如iconfoont.css等文件可以放置在static中,因为这些引入的第三方文件已经经过处理,我们不再需要处理,直接上传。
生命周期 | 是否获取dom节点 | 是否可以获取data | 是否获取methods |
---|---|---|---|
beforeCreate | 否 | 否 | 否 |
created | 否 | 是 | 是 |
beforeMount | 否 | 是 | 是 |
mounted | 是 | 是 | 是 |
实例尚未被初始化,对data、methods或文档节点的调用现在无法得到正确的数据。
实例已经被初始化,但是还没有挂载至
$el*
上,无法获取到对应的节点,可以获取到data与methods中的数据
与created阶段类似,节点尚未挂载,可以获取到data与methods中的数据。
完成了dom与css规则树的render,并完成对render tree进行了布局,vue的template成功挂载在$el中,可以调用节点
Vue的props是单向下行绑定:所以子组件中直接不可以修改父组件传入props
.sync
语法糖:可以对props进行“双向绑定”<text-document :title.sync="doc.title"></text-document>
// 当子组件需要更新 title 的值时,它需要显式地触发一个更新事件:
// 使用$emit及默认update方法
this.$emit('update:title', newValue)
这样title的属性在子组件内部更新,父组件也能感知的到,实现了“双向绑定”。
Object.defineProperty
只能劫持对象的属性,从而需要对劫持的每个对象,进行属性遍历,如果属性值是对象,还需要深度遍历,性能消耗比较大。
delete
:被删除的元素变成了 empty/undefined
其他的元素的键值还是不变Vue.delete
: 直接删除了元素,改变了元素的键值。安装动态懒加载所需插件;使用CDN资源。
location.href
:跳转刷新了页面
history.pushState()
:无刷新页面,静态跳转;
router.push()
:无刷新页面,静态跳转,使用了diff算法,实现了按需加载,减少了dom的消耗
注意:router
跳转和使用history.pushState()
没什么差别的,因为vue-router就是用了history.pushState(),尤其是在history
模式下。
简单来说,假如父组件需要在子组件内放一些DOM,那么这些DOM是显示、不显示、在哪个地方显示、如何显示,就是slot分发负责的活。
对于非大型单页应用,使用Vuex可能是繁琐冗余的。如果应用够简单,最好不要使用 Vuex。一个简单的 store 模式可以了。
根据vue-cli脚手架规范,一个js文件,一个css文件。
Vue路由在Android有问题,babel问题,安装
babel
polypill
插件解决。
方法:使用@click.native。
原因:router-link会阻止click事件,.native指直接监听一个原生事件。
- 浏览器中创建XMLHttpRequests;
- node.js创建http请求;
- 支持Promise API;
- 拦截请求和响应:
axois.interceptors.request/response
- 转换请求数据和响应数据:
- 取消请求:
axios.CancelToken.source()
- 自动换成json。
- axios中的发送字段的参数是data跟params两个,两者的区别在于params是跟请求地址一起发送的,data的作为一个请求体进行发送
params
一般适用于get
请求,data
一般适用于post
put
delete
请求。
Vuex
- 用法:
query
可以用path
和name
来引入,params
一定要用name
来引入- 接收::
query
->this.$route.query.name
,params
->this.$route.params.name
- url地址显示:
query
更加类似于我们ajax中get
传参会显示在url上,params
则类似于post
不会显示- 数据持久:
query
刷新不会丢失query里面的数据,params
刷新会丢失**params里面的数据。
在vue初始化之前,由于div是不归vue管的,所以我们写的代码在还没有解析的情况下会容易出现花屏现象,看到类似于{{message}}的字样
[v-cloak] {display: none;}
。style="display: none;" :style="{display: 'block'}"
push();pop();shift();unshift();splice(); sort();reverse()
- elementUI 饿了么
- ant-design 蚂蚁金服
- iView 腾讯
- VantUI 有赞
- VUX
- Mint UI
build: {
// ...
assetsPublicPath: './',
// ...
}
module.exports = {
publicPath: '', // 相对于 HTML 页面(目录相同)
}
beforeCreate, created, beforeMount, mounted
beforeCreate()
:初始化完成,但未往实例添加属性
应用:可以在这加个 loading 事件
created()
:往实例添加属性完成,但 DOM 还未生成
应用:在这结束 loading,还做一些初始化,实现函数自执行
beforeMount()
:可以获取节点,但数据未渲染
应用:在这发起 ajax 请求,拿回数据,配合路由钩子做一些事情
mounted()
:实例挂载到 DOM 完成
应用:节点操作
beforeUpdate()
:数据有更新但未更新节点update()
:更新节点完毕beforeDestroy()
destroyed()
:执行 destroy()后,不会改变已生成的 DOM 节点,但后续就不再受 vue 控制了
应用:清除定时器、延迟器、取消 ajax 请求等
一般 created/beforeMount/mounted 皆可.
vue生命周期总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后。
beforeCreated
阶段,vue实例的挂载元素$el
和数据对象data都undefined
,还未初始化。created
阶段,vue实例的数据对象data有了,$el
还没有。beforeMount
阶段,vue实例的$el和data都初始化了,但还是挂载之前为虚拟的dom节点,data.message还未渲染。mounted
阶段,vue实例挂载完成,data.message成功渲染。当视图改变同时更新模型层,当模型层改变也会同时更新视图层
vue用来写路由一个插件。
组件:router-link
、router-view
vue-router模块的
router-link
组件的属性
如果请求回的数据在组件中公用率大,可以将请求放入Vuex的actions里,数据放在vuex的state里,方便复用
如果请求回的数据仅仅在某个的组件内使用,就放在组件里请求。
state => 基本数据(数据源存放地)
getters => 从基本数据派生出来的数据
mutations => 提交更改数据的方法,同步!
actions => 像一个装饰器方法,包裹mutations,使之可以异步。
modules => 模块化Vuex
import
)。require.ensure
技术,也可以实现按需加载。这种情况下,多个路由指定相同的chunkName
,会合并打包成一个js文件。vue框架中状态管理。
场景:单页应用中,组件之间的状态。音乐播放、登录状态、加入购物车
import Vuex from "vuex";
Vue.use(Vuex);
const store = new Vuex.Store({});
new Vue({
store,
});
this.$store;
- 轻量级框架:只关注视图层,是一个构建数据的视图集合,大小只有几十kb;
- 简单易学:国人开发,中文文档,不存在语言障碍 ,易于理解和学习;
- 双向数据绑定:保留了
angular
的特点,在数据操作方面更为简单;- 组件化:保留了
react
的优点,实现了html的封装和重用,在构建单页面应用方面有着独特的优势;- 视图,数据,结构分离:使数据的更改更为简单,不需要进行逻辑代码的修改,只需要操作数据就能完成相关操作;
- 虚拟DOM:dom操作是非常耗费性能的,不再使用原生的dom操作节点,极大解放dom操作,但具体操作的还是dom不过是换了另一种方式;
- 运行速度更快:相比较与react而言,同样是操作虚拟dom,就性能而言,vue存在很大的优势。
可以在钩子函数 created、beforeMount、mounted中进行调用,因为在这三个钩子函数中,data已经创建,可以将服务端端返回的数据进行赋值。
created
钩子函数中调用异步请求
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。
每一个 Vuex 应用的核心就是store(仓库)。store
基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。
(1)Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
(2)改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化。
Vuex主要包括以下几个模块:
State
:定义了应用状态的数据结构,可以在这里设置默认的初始状态。Getter
:允许组件从 Store 中获取数据,mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性。Mutation
:是唯一更改 store 中状态的方法,且必须是同步函数。Action
:用于提交mutation,而不是直接变更状态,可以包含任意异步操作。Module
:允许将单一的 Store 拆分为多个 store 且同时保存在单一的状态树中。
- 单页面首次加载缓慢,但是后面的加载优势就会超过多页面了。
- 多页面则是首次加载快,但是后面每次都要进行加载。
vue比较适合做单页面的
优点:
缺点:
- 用 JavaScript 对象模拟真实 DOM 树,对真实 DOM 进行抽象;
- diff 算法 — 比较两棵虚拟 DOM 树的差异;
- pach 算法 — 将两个虚拟 DOM 对象的差异应用到真正的 DOM 树。
$nextTick
是在下次 DOM 更新循环结束之后执行延迟回调,
在修改数据之后使用$nextTick
,则可以在回调中获取更新后的 DOM
Class 可以通过对象语法
和数组语法
进行动态绑定:
<div v-bind:class="{ active: isActive, 'text-danger': hasError }"></div>
data: {
isActive: true,
hasError: false
}
<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
Style 也可以通过对象语法
和数组语法
进行动态绑定:
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
data: {
activeColor: 'red',
fontSize: 30
}
<div v-bind:style="[styleColor, styleSize]"></div>
data: {
styleColor: {
color: 'red'
},
styleSize:{
fontSize:'23px'
}
}
以下情况,不能检测到以下数组的变动
- 利用索引直接设置一个数组项时:
vm.items[indexOfItem] = newValue
- 直接修改数组的长度时:
vm.items.length = newLength
// Vue.set
Vue.set(vm.items, indexOfItem, newValue)
// vm.$set,Vue.set的一个别名
vm.$set(vm.items, indexOfItem, newValue)
// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)
// Array.prototype.splice
vm.items.splice(newLength)
Vue 的父组件和子组件生命周期钩子函数执行顺序可以归类为以下 4 部分:
父 beforeCreate -> 父 created -> 父 beforeMount -> 子 beforeCreate -> 子 created -> 子 beforeMount -> 子 mounted -> 父 mounted
父 beforeUpdate -> 子 beforeUpdate -> 子 updated -> 父 updated
父 beforeUpdate -> 父 updated
父 beforeDestroy -> 子 beforeDestroy -> 子 destroyed -> 父 destroyed
可以在钩子函数 created、beforeMount、mounted 中进行调用
- 能更快获取到服务端数据,减少页面 loading 时间;
- ssr 不支持 beforeMount 、mounted 钩子函数,所以放在 created 中有助于一致性;
keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,避免重新渲染 ,
特性:
include
和exclude
属性,两者都支持字符串或正则表达式,
include
表示只有名称匹配的组件会被缓存,exclude
表示任何名称匹配的组件都不会被缓存activated
和 deactivated
activated
:当组件被激活时,触发钩子函数 activated,deactivated
:当组件被移除时,触发钩子函数 deactivated。SSR服务端渲染:将标签渲染成的整个html片段的工作在服务端完成,服务端形成的html片段直接返回给客户端
服务端渲染的优点:
服务端渲染的缺点:
通过遍历数组和递归遍历对象,从而达到利用 Object.defineProperty() 也能对对象和数组(部分方法的操作)进行监听。
Proxy
- Proxy 可以直接监听对象而非属性;
- Proxy 可以直接监听数组的变化;
- Proxy 有多达 13 种拦截方法,不限于 apply、ownKeys、deleteProperty、has 等等
- Proxy 返回的是一个新对象,我们可以只操作新的对象达到目的
- Proxy 作为新标准将受到浏览器厂商重点持续的性能优化,也就是传说中的新标准的性能红利;
- 存在浏览器兼容性问题,无法用 polyfill 磨平
- 需要等到下个大版本( 3.0 )才能用 Proxy 重写。
Object.defineProperty
- 兼容性好,支持 IE9
- 只能通过遍历对象属性直接修改
- 拦截方法较少
首次加载缓慢,但是后面的加载优势就会超过多页面了
不需要考虑太多的兼容性就使用vue来做单页面
首次加载快,但是后面每次都要进行加载。
由于 Vue 会在初始化实例时对属性执行 getter/setter 转化,所以属性必须在 data 对象上存在才能让 Vue 将它转换为响应式的
vm.$set
的实现原理:
splice
方法触发相应式;defineReactiv
方法进行响应式处理
defineReactive 方法就是 Vue 在初始化对象时,给对象属性采用 Object.defineProperty 动态添加 getter 和 setter 的功能所调用的方法
key 是为 Vue 中 vnode 的唯一标记,通过这个 key, diff算法的操作可以更准确、更快速。
- 更准确:因为带 key 就不是就地复用了,在 sameNode 函数
a.key === b.key
对比中可以避免就地复用的情况。所以会更加准确。- 更快速:利用 key 的唯一性生成 map 对象来获取对应节点,比遍历方式更快。
使用cdn,不要打包一些公共的文件和组件库
通过异步的方式来加载对应的路由组件,提高页面相应速度
component、 slot 、transtion 、fliters
服务端渲染
router-link
避免了不必要的重渲染,它只更新变化的部分从而减少DOM性能消耗
\标签
每次跳转都得重渲染一次,消耗了大量的DOM性能
插槽就是子组件中的提供给父组件使用的一个占位符,用 表示
父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的标签。
methods
里面存放的方法每次调用都会重新计算(不会缓存)
computed
里面的方法调用计算后,当其参数不发生改变时再次调用,直接返回上次计算的结果,不重新计算(会响应数据缓存)
路由跳转过程中自动执行的钩子函数
全局守卫: 一般写在路由配置当中
路由独享守卫: 写在路由配置当中
组件内守卫: 写在组件内
会丢失,使用本地存储保存
Diff算法:将DOM抽象为虚拟DOM(是个对象), 然后通过新旧虚拟DOM 对比这两个对象的差异,最终只把变化的部分重新渲染,提高渲染效率的过程;
原理:通过JS层面的计算,返回一个patch对象,即补丁对象,在通过特定的操作解析patch对象,完成页面的重新渲染
预处理css,把css当前函数编写,可以定义变量,嵌套
vue-router模块的router-link组件。
v-if:判断是否隐藏;
v-for:数据循环出来;
v-bind:class:绑定一个属性;
v-model:实现双向绑定
assets文件夹是放静态资源;
components是放组件;
router是定义路由相关的配置;
view视图;
app.vue是一个应用主组件;
main.js是入口文件
default:默认值
type:类型校验使用
required:是否必要
data中的所有属性的操作(读/写)由vm对象来代理操作
属性描述符:
- configurable:是否可以重新定义
- enumerable:是否可以枚举
- value:初始值
- writable:是否可以修改属性值
- get:是一个回调函数,根据其他相关的属性动态计算得到当前属性值
- set:也是一个回调函数,监视当前属性值的变化,更新其他相关的属性值
Vue 3.0 的目标是让 Vue 核心变得更小、更快、更强大
监测机制的改变
带来基于代理 Proxy 的 observer 实现,提供全语言覆盖的反应性跟踪,
消除了 Vue 2 当中基于 Object.defineProperty 的实现所存在的很多限制:
新的 observer 还提供了以下特性:
模板
改了作用域插槽
对象式的组件声明方式
其它方面的更改
Vuex弱化dispatch,通过commit进行store状态的一次变更
取消了action概念,不必传入特定的action形式进行指定变更
弱化reducer,基于commit参数直接对数据进行转变,使得框架更加简易
共同思想
本质上:
Redux和Vuex都是对MVVM思想的服务,将数据从视图中抽离的一种方案形式上:
Vuex借鉴了Redux,将store作为全局的数据中心,进行数据管理