使用组合 API 共享道具

Posted

技术标签:

【中文标题】使用组合 API 共享道具【英文标题】:Sharing props with composition API 【发布时间】:2021-03-30 18:15:37 【问题描述】:

有没有办法使用组合 API 在组件之间共享 props,或者我仍然应该为此求助于 mixins?

例如,我有一个“可见”道具,我想在 5 个组件上重复使用它。如何在 1 个通用位置定义它并使用组合 API 重用它?

如果使用 mixin,我会以老式的方式完成:

const mixin = 
   props:  visibile:  type: Boolean: required: false  

在组件中使用:

mixins: [theMixinAbove]

如何使用组合 API 完成此操作?

【问题讨论】:

我不太明白你所说的“分享”道具是什么意思。每个组件都有自己的 props。 在 Vue 3 中,mixins 的 API 似乎没有改变,据我所知,没有其他方法可以实现这一点。 @Daniel_Knights 好的,但是如果我使用组合 API 的 mixins,我无法获得类型安全,对吧? 我实际上无法像您描述的那样让 mixin 与道具一起使用。你测试过它并且知道它有效吗? @Daniel_Knights 嗯,也许我误会了你,但是是的,我已经用 options API 做过很多次了,这只是重用 mixin 的问题。现在我正在考虑改用PropType<MyProps>,猜猜这是一个可行的选择...... 【参考方案1】:

你可以这样做,但我认为你也需要以类似的方式实现 props,并且你不能在设置期间这样做,因为此时,props 已经是预期的。

例如,您可以定义一个与您将在设置期间使用的其他功能一起使用的功能,然后将其分解为您的其余道具

props:myInternalProp:String, ...withVisibilityProps(),

const app = Vue.createApp()

app.component('my-component', 
  template: '<h1>My Component is visiblity</h1>',
  props:...withVisibilityProps(),
  setup(props)
    return(...withVisibility(props))
  
)

function withVisibility(props) 
  return visiblity:Vue.ref(props.visible?"visible":"not visible");

function withVisibilityProps() 
    return visible:Boolean;


app.mount('#app')
<script src="https://unpkg.com/vue@3.0.4/dist/vue.global.prod.js"></script>
<div id="app">
  <my-component :visible="true"></my-component>
  <my-component :visible="false"></my-component>
</div>

请注意,setup 函数用于处理visibility 变量。如果只需要prop,可以跳过withVisibilitysetup

【讨论】:

以上是关于使用组合 API 共享道具的主要内容,如果未能解决你的问题,请参考以下文章

将道具传递给设置时的VueJS 3组合API和TypeScript类型问题:类型上不存在属性“用户”

如何在 AngularJS 中实现组件组合(类似于 React 渲染道具模式)?

Vue 组合 API 中的只读目标

在 vue3 组合 api 中动态添加包装器元素

使用 createApp 传递道具

JestJS -> 不变违规:在“连接(投资组合)”的上下文或道具中找不到“商店”