1. MVC && MVVM
2. 数据双向绑定
3. Vue的生命周期
4. 虚拟dom的实现原理
5. vue-router
6. Proxy
7. vuex复制代码
v-show为false时,经过js设置display为none;为true时,设置display:''; 这样为了让js设置的display属性失效。javascript
v-if是经过js手动添加或删除dom元素。vue
组件间通讯总共分为一下几种:java
一、父 --> 子:es6
父元素用属性的格式传进来,子元素用props属性接收;算法
// 父元素
<editor :name='data'></editor>
// 子元素
props: {
name: {
type: Object,
defalut: function(){
}
}
}
复制代码
二、子 --> 父:vue-router
在父组件绑定一个事件,自组件用$emit出发事件vuex
三、兄弟组件:数组
四、组件嵌套比较深的时候:vuex浏览器
const SubPub = function() {
// 用Object格式,能够经过value存储订阅者的一些信息
// 订阅器 --- 相似于微信公众号这个平台,每个元素相似于一个公众号,key值为公众号的名字,value值记录订阅公众号的人;
this._observer = {};
}
SubPub.prototype = {
// 订阅函数,须要提供我要订阅的公众号名称,以及本身的姓名
subscribe: function(type, callback) {
const self = this;
if(Type(callback) !== 'function') return;
if(!self._observer[type]) this._observer[type] = []
this._observer[type].push(callback);
return self;
},
// 发布函数,须要提供哪一个公众号须要发布信息,以及发布的内容;
publish: function() {
const self = this;
const type = Array.prototype.shift.call(arguments); // 由于arguments不是数组,是一种类数组类型,因此没有shift、slice这些方法
//发布的内容
const theme = Array.prototype.slice.call(arguments);
const subs = self._observer[type];
if(!subs || !subs.length) return;
subs.forEach(sub => {
sub.apply(self, theme);
});
return this;
},
// 取消订阅,须要提供取消公众号的名字,和发起该取消操做的用户
removeSub: function(type, callback) {
const _subs = this._observer[type];
if(!_subs || !_subs.length) return;
_subs.map((item, index) => {
if(item === callback) {
_subs.splice(index, 1);
}
})
return this;
}
}
function Type(value) {
return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
}
// 实例一个发布订阅器
let sp = new SubPub();
// 定义订阅者
const sub1 = function(data) {
console.log('sub1' + data);
}
const sub2 = function(data) {
console.log('sub2' + data);
}
const sub3 = function(data) {
console.log('sub3' + data);
}
// 发起订阅操做
sp.subscribe('click', sub1);
sp.subscribe('input',sub1);
sp.subscribe('qqq',sub1);
sp.subscribe('click', sub2);
sp.subscribe('input', sub3);
// 开启发布
sp.publish('click', '第一次发布click事件');
sp.publish('input', '第一次发布input事件');
sp.removeSub('click', sub1).publish('click', '第二次发布click事件');复制代码
let obj = {};
let song = '七里香';
obj.singer = 'JayZhou';
Object.defineProperty(obj, 'music', {
configurable: true, // 能够配置对象, 为true的时候才能够删除属性
enumerable: false, // 是否可枚举
get () {
return song;
},
set (val) {
song = val;
}
});
console.log(obj.music); // {singer: '周杰伦', music: '七里香'}
obj.music = '听妈妈的话';
console.log(obj.music);
delete obj.music
console.log(obj);
for(var i in obj) {
console.log(i); // 只有singer 由于music是不可枚举的
}复制代码
默认状况下是hash模式,history须要后台配置,利用Html5的History API实现的,监听change变化。缓存
let p = new Proxy(target, handler);复制代码
var proxy = new Proxy({}, {
get: function(target, key, receiver) {
console.log(`get ${key}`);
return Reflect.get(target, key, receiver);
},
set: function(target, key, value, receiver) {
console.log(`set ${key}`);
return Reflect.set(target, key, value, receiver);
}
});
proxy.name = 'jack';
// set name
console.log(proxy.name);
// get name
// jack复制代码