SPA(single-page application,单页应用程序)。就是只有一个Web页面的应用,是加载单个HTML页面,并在用户与应用程序交互时动态更新该页面的Web应用程序。
优点:
缺点:
v-if 与 v-show 都能控制dom元素在页面的显示
v-if 相比 v-show 开销更大的(直接操作dom节点增加与删除)
如果需要非常频繁地切换,则使用 v-show 较好
如果在运行时条件很少改变,则使用 v-if 较好
Vue的生命周期是指vue的实例从创建、运行、到销毁的整个过程。
创建期间的生命周期函数
运行期间的生命周期函数
双向绑定由三个重要部分构成
当数据变化后更新视图,当视图变化后更新数据。通过监听器对所有数据的属性进行监听,
通过解析器对每个元素节点的指令进行扫描跟解析,根据指令模板替换数据,以及绑定相应的更新函数。
表示所谓的虚拟DOM,其实就是用JS来模拟DOM结构,把DOM的变化操作放在JS层来做,尽量减少对DOM的直接操作。
当数据有变化时,对比前后两次虚拟DOM的变化,只重新渲染变化了的部分,而没有变化的部分则不会重新渲染
diff算法就是进行虚拟节点对比,并返回一个patch对象,用来存储两个节点不同的地方,最后用patch记录的消息去局部更新Dom。
Vuex是实现组件全局状态 (数据) 管理的一种机制,可以方便的实现组件之间的数据共享。核心概念有:
State提供唯一的公共数据源,所有共享的数据都要统一放到State中进行存储
mutations是用来修改 state 中的数据
actions是发起异步请求
Getters是用于对Store中的数据进行加工处理,形成新的数据,类似Vue的计算属性
modules是用来拆分模块的,当一个项目中要使用多个store 时,可用modules来拆分模块
路由懒加载
懒加载即组件的延迟加载,通常vue的页面在运 行后进入都会有一个默认的页面,而其他页面只有在点击后才需要加载出来。使用懒加载可以将页面中的资源划分为多份,从而减少第一次加载的时候耗时。
使用CDN加载
通过在index.html 中直接引入第三方资源来缓解我们服务器的压力,其原理是将我们的压力分给了其他服务器站点。
服务器开启gzip
gizp压缩是一种http请求优化方式,通过减少文件体积来提高加载速度。html、js、css文件甚至json数据都可以用它压缩,可以减小60%以上的体积。
在webpack打包的过程中,将多余文件去掉,如 map 文件
页面的设计与开发应当根据用户行为以及设备环境(系统平台、屏幕尺寸、屏幕定向等)进行相应的响应和调整
遍历数组,每个元素都与后一个元素比较,如果大于下一个元素,则两个元素位置调换。
否则的话当前元素再与下下个元素比较,一直到 跟后面的元素都比较完。这个是升序的排序,降序则相反。
快速排序:
1.选择数组中间数作为基数,并从数组中取出此基数;
2.准备两个数组容器,遍历数组,逐个与基数比对,较小的放左边容器,较大的放右边容器;
3.递归处理两个容器的元素,并将处理后的数据与基数按大小合并成一个数组,返回。
promise 是为了解决异步嵌套而产生,让代码更易于理解。它有三种状态:
Pending:对象创建的初始状态
Resolved:成功的状态,then 接收
Rejected:失败的状态,catch 接收
状态一旦决定就不会改变
async/await 是写异步代码的新方式,使用的方式看起来像同步,它是基于promise实现的,但它不能用于普通的回调函数。
箭头函数是“=>”,普通函数是“function”。箭头函数不能作为构造函数,不能使用new。箭头函数不绑定arguments,但普通函数可以。
箭头函数中的this代表上层对象,如果上层对象没找到,则 this 指向 Window。普通函数中的this代表当前对象。
在平常开发中,有部分组件没有必要多次初始化,这时,我们需要将组件进行持久化,使组件的状态维持不变,在下一次展示时,
也不会进行重新初始化组件。 也就是说,keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染 。也就是所谓的组件缓存
闭包就是能够读取其他函数内部变量的函数。
闭包的缺点:滥用闭包函数会造成内存泄露
盒子模型:盒子模型分为4个板块,分别是:margin,border,padding,content。
margin:可以设置盒子的外边框与其他盒子之间的距离。
border:可以设置盒子边框的属性,例如边框的高度之类的。
padding:可以设置盒子里的内容与盒子内边框的距离,也就是content与内边框的距离。
content:这个就是盒子里边的内容区域,例如可以放 标签之类的。
原型是构造函数制造出的对象的公共祖先
构造函数会继承祖先
原型只有function才有
自己身上如果有属性,则取自己的,如果自己没有就继承原型.(原型可以提取公有属性)
原型链
后代继承了父代的原型,无法增删父代的原型
在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。
通俗点来说,就是数据是单一方向传输的,
父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子 组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解
1、所有状态的改变可记录、可跟踪,源头易追溯;
2、所有数据只有一份,组件数据只有唯一的入口和出口,使得程序更直观 更容易理解,有利于应用的可维护性;
3、一旦数据变化,就去更新页面(data-页面),但是没有(页面-data);
4、如果用户在页面上做了变动,那么就手动收集起来(双向是自动),合并 到原有的数据中。
computed:
1、支持缓存,只有依赖数据发生改变,才会重新进行计算
2、不支持异步,当computed内有异步操作时无效,无法监听数据的变化
watch:
1、不支持缓存,数据变,直接会触发相应的操作;
2、watch支持异步;
1、Vue.js 的组件化机制
组件就是对一个功能和样式进行独立的封装,让HTML元素得到扩展,从而使得代码得到复用,使得开发灵活,更加高效
2、Vue.js 的响应式系统原理
3、Vue.js 中的 Virtual DOM及Diff 原理
Diff算法的作用是用来计算出 Virtual DOM 中被改变的部分,然后针对该部分进行原生DOM操作,而不用重新渲染整个页面。
最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。
利用冒泡原理(子向父一层层穿透),把事件绑定到父元素中,以实现事件委托
基本数据类型:String,Boolean,number,undefined,object,Null
可以用typeof判断
引用数据类型:Object(Array,Date,RegExp,Function)
可以用instanceof判断,返回值为布尔值
两者都可以用Object.prototype.String判断
js是一种单线程的语言,事件循环是为了解决js单线程不会阻塞的一种机制。
由三个部分来工作:
也就是 Model-View-ViewModel 模式。
Model 层: 对应数据层的模型,主要⽤于抽象出 ViewModel 中视图的 Model
View 层: 视图,主要负责数据绑定的声明、 指令的声明、 事件绑定的声明
ViewModel 层: 把 View 层需要的数据进行暴露,当 ViewModel 中数据发生变化,View 层会得到更新
1、初始化仓库:git init
2、添加文件到仓库:git add
3、执行文件提交到仓库:git commit
4、查看当前仓库的状态:git status
5、版本回退:git reset
6、合并分支:git merge
7、从本地推送分⽀:git push origin branch
8、切换分支:git checkout
9、把最新提交的代码从远程仓库中拉取下来:git pull
1、引入辅助函数
2、模块化,为了让代码更好维护,让多种数据分类更加明确,我们可以选择将Vuex模块化。
当执行new Vue时,实际上是执行了_init方法。_init方法会做一堆初始化工作,首先是对options的合并,然后是一系列 init 方法,对data进行proxy处理和响应式处理observe,最后调用$mount做挂载。
Vue 的响应式是通过 Object.defineProperty 对数据进行劫持,并结合发布订阅者模式实现。 Vue 利用 Object.defineProperty 创建一个 observe 来劫持监听所有的属性,把这些属性全部转为 getter 和 setter。Vue 中每个组件实例都会对应一个 watcher 实例,它会在组件渲染的过程中把使用过的数据属性通过 getter 收集为依赖。之后当依赖项的 setter 触发时,会通知 watcher,从而使它关联的组件重新渲染。
(1)原型链
当访问一个对象的某个属性时,会先在这个对象本身的属性上找,如果没有找到,会去这个属性的__proto__属性上找,即这个构造函数的prototype,如果还没找到,就会继续在__proto__上查找,
直到最顶层,找不到即为undefined。这样一层一层往上找,彷佛是一条链子串起来,所以叫做原型链。
(2)作用域链
变量取值会到创建这个变量的函数的作用域中取值,如果找不到,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。
(3)区别
作用域是对变量而言,原型链是对于对象的属性而言
作用域链的顶层是window,原型链的顶层是Object
var声明的变量会挂载在window上,而let和const声明的变量不会
var声明的变量存在变量提升,let和const不存在变量提升
同一作用域下var可以声明同名变量,let和const、不可以
let和const声明会形成块级作用域
let暂存死区
const一旦声明必须赋值,不能用null占位,声明后不能再修改,如果声明的是复合类型数据,可以修改属性
1.首先执行的是父组件的beforeCreate
2.执行的是父组件的created周期
3.执行的是父组件的beforeMount周期
4.执行的是子组件的beforeCreate周期
5.执行的是子组件的created周期
6.执行的是子组件的beforeMount周期
7.执行的是子组件的mounted周期
8.执行的是父组件的mounted周期
总结:
执行的先后顺序为 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted 。
父组件传值给子组件(异步)钩子函数
一、父子组件异步传值的坑
子组件的生命周期只会执行一次,但是当子组件渲染的时候父组件的数据还没接受完就会造成子组件没有任何
内容渲染。
二、解决父子组件异步传值的方法