Vue.js 框架学习

学习资料

Vue2.1.7源码学习

Vue渲染器

Vue.js 技术揭秘

【源码级回答】大厂高频 Vue 面试题(上)

「源码级回答」大厂高频 Vue 面试题(中)

20+ Vue 面试题整理

关于 Vue 最好搞清楚原理的几题面试题

页面引入 Vue.js 文件时做了什么准备工作?

function Vue (options) {
  debugger
  if (!(this instanceof Vue)
  ) {
    warn('Vue is a constructor and should be called with the `new` keyword');
  }
  this._init(options);
}

initMixin(Vue);
stateMixin(Vue);
eventsMixin(Vue);
lifecycleMixin(Vue);
renderMixin(Vue);


function initGlobalAPI (Vue) {
  initUse(Vue);
  initMixin$1(Vue);
  initExtend(Vue);
  initAssetRegisters(Vue);
}

initGlobalAPI(Vue);

Vue 构造函数实例化时发生了什么?

function Vue (options) {
  this._init(options);
}

function initMixin (Vue) {
  Vue.prototype._init = function (options) {
    var vm = this;
    initProxy(vm);
    vm._self = vm;
    initLifecycle(vm);
    initEvents(vm);
    initRender(vm);
    callHook(vm, 'beforeCreate');
    initInjections(vm);
    initState(vm);
    initProvide(vm);
    callHook(vm, 'created');
    if (vm.$options.el) {
      vm.$mount(vm.$options.el);
    }
  };
}

Vue.prototype.$mount = function (el, hydrating) {
  return mountComponent(this, el, hydrating)
};

精华代码片段

检测并重写bind

function polyfillBind (fn, ctx) {
  function boundFn (a) {
    const l = arguments.length
    return l
      ? l > 1
        ? fn.apply(ctx, arguments)
        : fn.call(ctx, a)
      : fn.call(ctx)
  }

  boundFn._length = fn.length
  return boundFn
}

function nativeBind (fn, ctx) {
  return fn.bind(ctx)
}

const bind = Function.prototype.bind
  ? nativeBind
  : polyfillBind

 浏览器环境嗅探

  // Browser environment sniffing
  var inBrowser = typeof window !== 'undefined';
  var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
  var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
  var UA = inBrowser && window.navigator.userAgent.toLowerCase();
  var isIE = UA && /msie|trident/.test(UA);
  var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
  var isEdge = UA && UA.indexOf('edge/') > 0;
  var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');
  var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');
  var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
  var isPhantomJS = UA && /phantomjs/.test(UA);
  var isFF = UA && UA.match(/firefox\/(\d+)/);

 

父子组件生命周期顺序

父beforeCreate→父created→父beforeMount→子bereforeCreate→子created→子beforeMound→子mounted→父mounted

 

posted on 2019-10-31 16:08  dawnxuuu  阅读(119)  评论(0编辑  收藏  举报

导航