vue provide inject好处和缺点,vue provider inject

  vue provide inject好处和缺点,vue provider inject

  本文主要介绍了vue的提供和注入的使用方法和原理。本文通过源代码非常详细地向您介绍,对您的学习或工作有一定的参考价值。有需要的朋友可以参考一下。

  先说说为什么要用provide/inject。对于爷爷和孙子组件之间,甚至是爷爷和孙子组件之间的通信,我们用vuex是可以的。

  那是真的,但是,请听我说。但是,有时候你的项目很小,甚至组件通信的场景也很少。所以,你只是为了那几个交流参考而引入vuex,是不是一种浪费?有人可能还会想到用$parent来获取父组件实例来获取数据/方法。这种两层还好,但是多层呢?如果组件嵌套很深,如何实现呢?再写一个函数封装$parent。那不是很麻烦吗?你不必为了拯救国家而弯曲曲线。哈哈~那太远了。

  不废话那么多了,就告诉你用provide/inject就是解决你这些问题,准没错。让我们看看如何使用呢?反手就是几行简单的代码:

  1.父组件提供要传递给子组件的参数。

  提供(){

  返回{

  列表类型:this.listType,

  }

  }

  2.子组件的使用:

  注入:[listType],

  当然,您也可以在inject中指定您的缺省值和参数的来源:

  注入:{

  列表类型:{

  from定义的名称: par//provide

  默认值:1

  }

  }

  好吧!不是很简单吗?事实上,无论组件级别有多深,父组件和祖先组件都可以向后代组件注入依赖关系。

  多说一些:

  provide可以是一个对象,也可以是一个返回对象的函数。

  inejct:可以是字符串数组或者一个对象。

  如果你有兴趣,可以看看下面的源代码部分,它相当容易理解:

  provide的核心源码:

  导出函数provideT(key:injection keyt string number,value: T) {

  如果(!currentInstance) {

  if (__DEV__) {

  warn(`provide()只能在setup()内部使用。`)

  }

  }否则{

  //获取当前组件的提供程序。默认实例继承父类的Providers对象。

  let provides=current instance . provides

  //使用父提供对象作为原型来创建自己的提供对象

  const parentProvides=

  currentInstance.parent当前实例. parent .提供

  if (parentProvides===provides) {

  provides=current instance . provides=object . create(parent provides)

  }

  提供[字符串形式的键]=值

  }

  }

  inject的核心源码:

  导出函数注入(

  key: InjectionKeyany string,

  默认值?未知,

  treatDefaultAsFactory=false

  ) {

  //获取当前组件实例

  const instance=current instance currentRenderingInstance

  if(实例){

  //Get提供

  常量提供=

  instance.parent==null

  ?instance . vnode . app context instance . vnode . app context . provides

  :instance.parent.provides

  if(在provides中提供(key as string symbol){

  //如果键存在,直接返回

  return提供[字符串形式的键]

  } else if (arguments.length 1) {

  //如果键不存在,设置了默认值就直接返回默认值。

  返回treatDefaultAsFactory is function(default value)

  ?defaultValue.call(实例.代理)

  :默认值

  } else if (__DEV__) {

  //如果没有,则提示

  warn(`injection ${String(key)} 未找到。`)

  }

  } else if (__DEV__) {

  warn(`inject()只能在安装程序()或功能组件中使用。`)

  }

  }

  关于分析使用vue的provide和inject的方法和原理的文章到此为止。有关vue provide和inject使用的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: