vue mixin混入,生命周期执行阶段简易实现

Posted qq_27449993

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue mixin混入,生命周期执行阶段简易实现相关的知识,希望对你有一定的参考价值。

全局混入生命周期,在vue中组件中,会收集都放在 Vue.options上,在组件上的混入的生命周期会收集在组件实列this.$options上

先实现将mixin中的生命周期函数收集到Vue.options,

形成这样的形势

全局mixin是给全部Vue文件添加一些公用的实例,我们需要实现一个Vue.mixin方法

来讲所有的全局注册的mixin里面的生命周期依次收集,我们这里只讲生命周期收集,像data,watch这些需要的自己添加策略去实现

    Vue.options = 
Vue.mixin=function(option)
    let vmOption=this.options
    this.options=mergeOptions(vmOption,option)
    console.log('this.options',this.options)

先定义options,然后将用户写的mixin跟当前options上的生命周期进行合并

function mergeOptions (parent, child) 
//定义新的optins parent代表被合并的,child需要进行合并的
  let options = 
//这里合并,情况分为,被合并上面有的parent,child上面可能有可能没有
  for (let key in parent) 
    mergeField(key)
    console.log(options)
  
//还有种情况,上面已经遍历了parent上面的所有的属性,但是child上面有的,但是parent上面没有的情况还
// 没有遍历到,所有需要遍及child,然后排除parent上有的
  for (let key in child) 
    if (!parent?.hasOwnProperty(key)) 
      mergeField(key)
    
  
  function mergeField (key) 
    // 合并字段
    // 根据key 不同的策略来进行合并
    if (strats[key]) 
      options[key] = strats[key](parent[key], child[key])
     else 
      // todo默认合并
      options[key] = child[key]
    
  
  return options

这里合并,情况分为,被合并上面有的parent,child上面可能有可能没有

//还有种情况,上面已经遍历了parent上面的所有的属性,但是child上面有的,但是parent上面没有的情况还
// 没有遍历到,所有需要遍及child,然后排除parent上有的

然后进行每一项的合并,在合并过程中我们需要用到策略模式

什么是策略模式呢?

策略模式的定义:定义一系列的算法,将他们一个个封装起来,使他们直接可以相互替换。

策略模式是开发中常用的第二种设计模式,它在开发中非常常见,由两部分组成。第一部分是策略类,封装了许多具体的,相似的算法。第二部分是环境类,接受客户请求,随后将请求委托给策略类。说的通俗一点就是将相同算法的函数存放在一个包装里边,每个函数用相同的方式拿出来,就叫做策略模式。

策略模式,可以帮助我们减少if else的写法

这里我们定义一个策略对象const strats =

我们需要合并到的生命周期方法合并的策略是一样的,但是在合并 data,watch computed,methods 是不一样的,所有我们需要写

strats.data=function (parent,child)

strats.watch =function (parent,child)

strats.computed=function (parent,child)

每个的合并是不一样的,但是生命周期方法的合并是一样的,我们定义一个数组

const LIFECYCLE_HOOKS = [
  'beforeCreate',
  'created',
  'beforeMount',
  'mounted',
  'beforeUpdate',
  'updated',
  'beforeDestroy',
  'destroyed'
]

然后遍历数组,为生命周期定义合并方法

LIFECYCLE_HOOKS.forEach(key=>
  strats[key]=mergeHook;
)
function mergeHook(parent,child)
  if(child)
    if(parent)
      return parent.concat(child)
    else
      return [child]
    
  else
    return parent
  

在mergeHook中,进行真正的合并,如果child中没有,直接返回parent ,

测试

 Vue.mixin(
        created: function () 
          var myOption = this.$options
          if (myOption) 
            console.log('1',myOption)
          
        
      )
      Vue.mixin(
        created: function () 
          var myOption = this.$options
          if (myOption) 
            console.log('2',myOption)
          
        
      )
      Vue.mixin(
        created: function () 
          var myOption = this.$options
          if (myOption) 
            console.log('3',myOption)
          
        
      )

在这里 parent 第一次代表的是  Vue.options = ,child代表的是

 第二次parent代表的是[created: function ()
          var myOption = this.$options
          if (myOption)
            console.log('1',myOption)
         
       
      )],child代表的是

 最终打印出来 console.log('this.options',this.options)

结果

 在vue组件上的生命周期跟全局上的合并,是在vue初始化方法init里面Vue.prototype._init

Vue.prototype._init=function(option)
  let vm =this
  this.$options=option
  
  this.$options=mergeOptions(vm.constructor.options,option)
  
  console.log('this.$options',this.$options)
  //初始化:watch,computed props data 生命周期
  callHook(vm,'beforeCreate')
  initState(vm)
  callHook(vm,'created')
  if(option.el)
    vm.$mount(option.el)
  

这里我们为什么用vm.constructor.options指向的是vue.options,为什么不直接用vue.options,却要用他的实列,大家可以思考一下

以上是关于vue mixin混入,生命周期执行阶段简易实现的主要内容,如果未能解决你的问题,请参考以下文章

vue mixin混入,生命周期执行阶段简易实现

:vue生命周期vue的DOM操作mixin混入,插件

vue之mixins的使用

vue生命周期总共有几个阶段?

深入 Vue 生命周期

Vue-Mixin