Vue.js - 父级基于无渲染子数据生成组件

Posted

技术标签:

【中文标题】Vue.js - 父级基于无渲染子数据生成组件【英文标题】:Vue.js - Parent generate component based on renderless child data 【发布时间】:2021-05-19 20:16:36 【问题描述】:

我正在尝试使用 vue 3vue-class-component 创建一个按钮生成系统,期望如下:(注意按钮的数量given 不是静态的,这意味着它可以是 1 个或多个)

输入

<ButtonGroup id="bg1">
    <Button text="button1" url="./location1" />
    <Button text="button2" url="./location2" />
    ...
</ButtonGroup>

这里Button 是无渲染的,ButtonGroup 首先获取其所有子数据以进行预处理,例如设置主按钮,然后再渲染整个 shebang,结果如下:

输出

<div id="bg1" class="button-group">
    <a href="./location1" class="button primary">button1</a> 
    <a href="./location2" class="button">button2</a> 
    ...
</div>

ButtonButtonGroup 类的代码如下所示

// File Button.vue
@Options()
export default class Button extends Vue 
    @Prop() text!: string | undefined
    @Prop(default:"") url!: string


// File ButtonGroup.vue
@Options()
export default class ButtonGroup extends Vue  // This is the rendering class
    @Prop() id: string | undefined
    buttons: Array<Button> = [] // Contains buttons so it can be dynamically rendered

    beforeCreated() // Or created or so. 
        ...
    

现在我完全意识到,在 Vue 3 中实现这一点,访问子级变得相当困难,但这是我认为最简单的选择。我该如何让它发挥作用?

另一种选择是Button 将创建&lt;a&gt; 标签,然后ButtonGroup 将主标签添加到相应的标签中,但这让我觉得更加复杂,因为我还有一些其他类似的元素在等待与按钮相同的处理方式,我可能会再次卡在路上的某个地方。

【问题讨论】:

你熟悉 Vue 中的render function API 吗?这可能是您需要使用的。 我看过了,但这会渲染 Button 组件,除了此刻它甚至拒绝在 ButtonGroup 容器内渲染之外,这意味着它不是无渲染 【参考方案1】:

我之前在 Vue 中使用 href 浏览页面时遇到过这个问题。

我建议您将&lt;a href="./location1"/&gt; 更改为&lt;router-link to="./location1"/&gt;

【讨论】:

会的,谢谢!但是它并不能解决手头的问题。

以上是关于Vue.js - 父级基于无渲染子数据生成组件的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 使用父数据渲染子组件

在 vue.js 中渲染子组件之前等到父组件安装/准备好

初学Vue.js:props

在 vue.js 组件中渲染子组件

Vue.js父组件事件处理方法无法正常访问自己的数据

使用 vue.js 和 laravel 从子级向父级发送数据