vue-injection-helper 帮您处理依赖注入的问题

https://www.npmjs.com/package/vue-injection-helper

我做了个针对 Vue3+ 的工具,叫做 vue-injection-helper

它有一些类型帮助的 api

但是最重要的还是三个 api —— defineModule , aggregateEvent 和 aggregateRef

首先,我们写一段组件代码,只包含 setup

setup(){
  const name = ref('')
  const password = ref('')
  const changeName = (val:string)=> name.value = val
  return {name,password}
}

可以看到,这个 name 和 password,还有变更 name 的函数,我们只能在组件中访问

怎么让它的子孙组件也能访问呢?(注意是 ref,包含 get,set 操作)

我们用 defineModule :

setup(){
  const name = ref('')
  const password = ref('')
  const changeName = (val:string)=> name.value = val
  const service = {name, password, changeName}
  defineModule(service, 'profile-token')
  return service
}

好了,子孙组件都能访问 name 和 password 了:

setup(){
  const profileService = {
    name: aggregateRef('profile-token',['name','value'], ''),
    changeName: aggregateEvent('profile-token',['changeName'])
  }
  return {profileService}
}

为什么要用 aggregateRef 和 aggregateEvent 包裹呢?

为了帮你处理类型问题,变注入为声明,如果注入未生效,那么直接用默认值新建的 ref 作为数据返回给你 (event 默认为 ()=>{}),这样,你的组件就能不通过 props 传递响应式数据的情况下,还能独立变化

而且,注意到,你还可以继续向下传递,以及组合其它的 module

setup(){
  const profileService = {
    name: aggregateRef('profile-token',['name','value'], ''),
    changeName: aggregateEvent('profile-token',['changeName'])
  }
  defineModule(service,'child-token')
  return {profileService}
}

为什么不用 reactive ?

因为 reactive 一旦经过 computed,就会变成 ref,所以无法做到层层传递,因此只用 ref

希望大家喜欢,如果能够帮助到大家,不胜荣幸