最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 【七日打卡】呜呼~ vue生命周期原理原来如此

    正文概述 掘金(早上吃包子)   2021-01-11   380

    前言

    相信vue生命周期的几个钩子大家都很清楚,那它具体是怎么实现的呢?

    在讲生命周期原理之前,我们还要先讲一下vue.mixin这个和生命周期有关的api。

    mixin

    简介

    vue官方文档是这么介绍的

    通俗点讲,就是对Vue构造函数做一些混入操作,影响每个vue实例。

    原理

    通过mergeOptions 将各个Vue.mixin的 options 合并到Vue.options

    import {mergeOptions} from '../util/index.js'
    export function initGlobalAPI(Vue){
        Vue.options = {};
    
        Vue.mixin = function (mixin) {
            this.options = mergeOptions(this.options,mixin);
            return this;
        }
    }
    

    采用策略模式,不同options(比如data、method、lifeCycleHooks)对应不同合并策略。

    let lifeCycleHooks = [
        'beforeCreate',
        'created',
        'beforeMount',
        'mounted',
        'beforeUpdate',
        'updated',
        'beforeDestroy',
        'destroyed',
    ]
    let strats = {}; // 存放各种策略
    //   {}     {beforeCreate:Fn} => {beforeCreate:[fn]}
    //   {beforeCreate:[fn]}    {beforeCreate:fn}   => {beforeCreate:[fn,fn]}
    
    function mergeHook(parentVal, childVal) {
        if (childVal) {
            if (parentVal) {
                return parentVal.concat(childVal); // 后续
            } else {
                return [childVal]; // 第一次
            }
        } else {
            return parentVal
        }
    }
    lifeCycleHooks.forEach(hook => {
        strats[hook] = mergeHook
    });
    export function mergeOptions(parent, child) {
        const options = {}; // 合并后的结果
        for (let key in parent) {
            mergeField(key);
        }
        for (let key in child) {
            if (parent.hasOwnProperty(key)) {
                continue;
            }
            mergeField(key);
        }
    
        function mergeField(key) {
            let parentVal = parent[key];
            let childVal = child[key];
            // 策略模式
            if (strats[key]) { // 如果有对应的策略就调用对应的策略即可
                options[key] = strats[key](parentVal, childVal)
            } else {
                if (isObject(parentVal) && isObject(childVal)) {
                    options[key] = { ...parentVal, ...childVal }
                } else {
                    options[key] = child[key] || parent[key];
                }
            }
        }
        return options
    }
    

    生命周期原理

    1.合并生命周期

    合并vm.$options 上和Vue.options,也是通过上述mergeOptions方法

      Vue.prototype._init = function(options) {
    //...
            vm.$options = mergeOptions(vm.constructor.options, options); 
        }
    

    2.调用生命周期

    通过callHook找到实例的钩子,让钩子数组里的方法依次执行。

    export function callHook(vm,hook){
        let handlers = vm.$options[hook];
        if(handlers){
            for(let i =0; i < handlers.length;i++){
                handlers[i].call(vm)
            }
        }
    }
    

    3.初始化流程中调用生命周期

    在初始化流程中的不同阶段调用callhook

    Vue.prototype._init = function (options) {
        const vm = this;
        vm.$options = mergeOptions(vm.constructor.options,options);
        // 初始化状态
        callHook(vm,'beforeCreate');
        initState(vm);
        callHook(vm,'created');
        if (vm.$options.el) {
        	vm.$mount(vm.$options.el);
        }
    }
    

    上面是手写的简易版实现原理

    我们再来看看源码? 【七日打卡】呜呼~ vue生命周期原理原来如此

    没错吧,源码就是通过callHook来实现vue的生命周期原理。

    小结

    vue的生命周期原理,就是将各个生命周期里的方法合并,存到数组里。在通过callhook,来调用各个生命周期里对应的方法。最后在初始化流程中的不同阶段调用对应的callhook


    起源地下载网 » 【七日打卡】呜呼~ vue生命周期原理原来如此

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元