1、VueX中的属性包含哪些?
Vuex是vue的状态统一管理管理机制。统一管理和维护各个Vue组件的可变化状态(数据)。
它的核心是5个属性:
1、state:Vuex的基本数据。用来存储变量。
2、getters:从基本数据中派生的数据,相当于是state计算属性。
3、mutations:提交更新数据的方法,必须是同步的(若是异步的需要使用action)。每个mutation都有一个事件类型type(string)和一个回调函数handler。handler是实际更改状态的地方。它将state作为第一个参数,将提交载荷作为第二个参数。
4、actions:和mutation的功能大致相同。不同的是:它提交的是mutation,而不是直接变更状态。它可以包含任意的异步操作。
5、modules:模化Vuex,使得每个模块都有自己的state,mutation,getter,action,使得结构清晰,方便管理。
2、单页面应用与多页面应用的区别?及其优缺点?
单页面应用:singlePage Web application。(SPA)。是指只有一个主页面的应用。浏览器一开始加载所有所需的html,js,css等资源,所有页面的内容包含在这个主页面中。单在写的时候还是分开写,在交互时由路由程序动态载入。单页面的页面跳转,仅需要刷新局部资源,多应用于pc端。
单页面应用的优点:响应快,用户体验好,服务器压力小。前后端分离。页面切换效果比较炫酷。参数仅在一个页面传。
缺点:导航不可用;初次加载耗时多,开发成本高
多页面应用:multiPage Web application。(MPA)一个应用中有多个页面,页面跳转时需要整个页面的刷新。
多页面应用的优点:可以采用导航路由跳转。开发成本底。
缺点:参数传递复杂,可通过路由带参传递,cookie,localStorage等方法。开发时重复代码多。
3、vue中子组件访问父组件的方式?
两种方式:
第一:子组件向父组件传递参数
子组件通过this.$emit('childHandler','我是向父组件传的参数‘)
例如:
//子组件中
...
//父组件中
第二:子组件访问父组件的方法
共有三种:
1、通过子组件直接在方法中调用:this.$parent.fatherHandlerName;
2、通过$emit触发一个父组件的事件,父组件监听这个事件就行。
//父组件中
...
fatherMethod(){
console.log('test');
}
//子组件中
...
childMethod(){
this.$emit('fatherHandler')
}
3、父组件把方法传入子组件中。子组件通过props接受一个函数类型的参数(父组件的方法),从而实现调用。
//父组件中
...
fatherMethod(){
console.log('test')
}
//子组件中
...
4、 vue的生命周期?
vue的生命周期可以总结为8个钩子函数(生命周期函数)。
1、beforeCreat
此时:vue的实例挂在元素$el和数据对象data都为undefined,还未初始化。
可以做:加Loading事件
2、created
此时:数据对象data的属性可访问,实例的挂载元素$el还是undefined。
可以做:结束Loading事件,请求初始化data中的数据,为渲染元素做准备。
3、beforeMount
此时:数据对象data和实例挂载元素$el都初始化完成,但是虚拟DOM节点中data.filter还没有替换。
可以做:nothing
4、mounted
此时:$el实例挂载完成,data.filter渲染完成
可以做:配合路由钩子使用
5、beforeUpdate
此时:data正在更新。
可以做:nothing
6、updated
此时:data在更新
可以做:可以配合watch进行监测。
7、beforeDestory
此时:组件销毁中。
可以做:nothing
8、destoryed
此时:组件销毁,没有事件监听以及dom绑定,但是dom依然存在。
在执行destroy方法后,对data的改变不会再触发周期函数,此时的vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在。所以对于实时显示的通知型组件,在他destroyed之前,我们必须手动removeChild()删除该节点;否则,DOM节点还是存在,影响浏览器性能。
可以做:nothing
5、vue中的router路由和location.href有什么区别?
location.href='/url' :简单方便但是刷新了页面。
引入router,然后使用router.push('/url')来跳转,使用了diff算法,实现了按需加载,节省了dom消耗。
6、数组去重?
第一:使用数组的indexOf并通过for循环来实现。
它是最简单的数组去重方法(indexOf方法)
实现思路:新建一个数组,遍历去要重的数组,当值不在新数组的时候(indexOf为-1)就加入该新数组中
var arr=[2,8,5,0,5,2,6,7,2];
function unique1(arr){
var hash=[];
for (var i = 0; i < arr.length; i++) {
if(hash.indexOf(arr[i])==-1){
hash.push(arr[i]);
}
}
return hash;
}
第二:使用sort排序筛选出不一样的元素。排序后相邻去除法
实现思路:给传入的数组排序,排序后相同的值会相邻,然后遍历排序后数组时,新数组只加入不与前一值重复的值。
function unique2(arr){
arr.sort();
var hash=[arr[0]];
for (var i = 1; i < arr.length; i++) {
if(arr[i]!=hash[hash.length-1]){
hash.push(arr[i]);
}
}
return hash;
}
第三:Es6的set方法
基本思路:ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化。
function unique3(arr){
var x = new Set(arr);
return [...x];
}
7、js常用的排序?(基本的算法能力)
冒泡排序:最简单,也最慢,貌似长度小于7最优
插入排序: 比冒泡快,比快速排序和希尔排序慢,较小数据有优势
快速排序:这是一个非常快的排序方式,V8的sort方法就使用快速排序和插入排序的结合
希尔排序:在非chrome下数组长度小于1000,希尔排序比快速更快
系统方法:在forfox下系统的这个方法非常快
8、ES6中的原型链的继承大概讲一下。
原型链
访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链。
__proto__是js对象的属性方法得以继承共享的基石。
实例,构造函数,原型,这三者构成一个原型单元。
我们可以通过把原型链整张图拆解为一个个原型单元,理解原型链
此外:
9、解决跨域的方式有几种?
第一种:CORS。跨资源共享。在服务器端通过设置Access-control-Allow-origin控制可访问的url。
第二种:JSONP,仅支持get请求。通过script的src属性引入从服务器端获取的跨域数据文件,实现跨域请求。
此时要在ajax中指出:(jQuery中)
1)、dataType:‘jsonp',
2)、jsonpCallback:’handlercallback',
axios(vue或react中)中:jsonp:’handlercallback',
第三种:document.domain+iframe。此方案仅限主域相同子域不同的跨域请求。两个页面通过js强制设置document.domain为基础主域,实现同域。
第四种:location.hash+iframe
原理:a,b,c.三个页面要实现跨域。切互相有如下关系时:b是a的子页面,c是b的子页面,相互通过iframe来嵌套。那么当c想访问a页面,则可以是:window.parent.parent.onCallback();
第五种:window.name+iframe.
利用window的name属性可以在不同页面(跨域后)加载后仍旧存在,并且可支持非常长的name值(2MB)。
可以通过iframe的src属性将外域转向本地域。跨域数据可以有window的name属性值有外域带到本地域。这个巧妙的饶过了浏览器的跨域限制,但它又是安全操作。
第六种:postMessage跨域
postMessage是XMLHttpRequest Level2中的API,它可以实现以下几种情况的跨域请求:
1)、当前页面和打开新窗口之间的跨域参数传递;
2)、多窗口之间的信息传递;
3)、页面与嵌套的iframe之间的参数传递
用法:postMessage(data,origin)
data:html5页面可支持的任意类型数据或者是可复制的对象,由于部门浏览器只支持字符串,建议使用JSON.stringify(data)序列化。
origin:'协议://主机:端口号'。也可设置为‘*’。或是当前窗口的同源地址时,可以设置为'/'。
第七种:nginx反向代理跨域。
第八种:nodeJs中中间价代理跨域。
第九种:webSocket协议跨域。
这位讲的很详细:https://segmentfault.com/a/1190000011145364
10、三栏布局的实现方式?
可以采用:浮动布局;flex布局;定位:position:absolute;margin+百分比;