<template> <component :is="type" v-bind="linkProps(to)"> <slot /> </component> </template> <script> import { isExternal } from '@/utils/validate' export default { props: { to: { type: String, required: true } }, computed: { isExternal() { return isExternal(this.to) }, type() { if (this.isExternal) { return 'a' } return 'router-link' } }, methods: { linkProps(to) { if (this.isExternal) { return { href: to, target: '_blank', rel: 'noopener' } } return { to: to } } } } </script>报错 Maximum call stack size exceeded
时间: 2024-02-14 19:35:19 浏览: 46
这个错误通常发生在无限循环中,也就是组件递归调用自身导致的。你可以检查一下你的代码是否存在这种情况。在你的代码中,你使用了 computed 属性来计算 isExternal 和 type,这两个属性都引用了 to 属性,而 to 属性又作为 props 传递给了组件。这样会导致组件递归调用自身,从而导致 Maximum call stack size exceeded 错误。你可以尝试将这两个计算属性改为普通的方法,或者使用其他方式避免循环引用的问题。如果你无法解决问题,可以提供更多的代码信息,我可以帮你进一步分析。
相关问题
<template> <component :is="type" v-bind="linkProps"> <slot /> </component> </template>
这是一个 Vue.js 的单文件组件的模板,其中包含一个动态组件,它根据传入的 `type` 属性来动态渲染不同的子组件。同时,通过 `v-bind` 指令将 `linkProps` 对象中的所有属性绑定到子组件上,使得子组件可以接收到这些属性。最后,`<slot />` 表示一个匿名插槽,用于在父组件中插入子组件的内容。
<component :is="listComponent" v-bind:gridConfig="gridConfig" @formCreateMethod="createDialog" ref="abc" > <template #card="{ row }"> <i v-if="row.CardId != null" class="vxe-icon-check" style="color: var(--el-color-success)" ></i> <i v-else class="vxe-icon-close" style="color: var(--el-color-error)" ></i> </template> </component>组件上定义的插槽如何映射到组件内的vxe-grid上<template> <vxe-grid :ref="gridId" :id="gridId" v-bind="gridOptions" @cell-menu="cellContextMenuEvent" v-on:menu-click="contextMenuClickEvent" v-on:toolbar-button-click="toolbarToolClickEvent" :loading="loading" class="mytable-scrollbar" align="center" > <!-- 这里是插槽位置 --> </vxe-grid> </template>
要将父组件中定义的插槽映射到`<vxe-grid>`组件内部,你可以使用`<slot>`标签来接收插槽内容,并将其放置在`<vxe-grid>`组件的适当位置。
在你的封装组件中,可以将父组件中的`#card`插槽映射到`<vxe-grid>`组件的合适位置。例如,你可以这样修改封装组件的模板:
```html
<template>
<div>
<vxe-grid
:ref="gridId"
:id="gridId"
v-bind="gridOptions"
@cell-menu="cellContextMenuEvent"
v-on:menu-click="contextMenuClickEvent"
v-on:toolbar-button-click="toolbarToolClickEvent"
:loading="loading"
class="mytable-scrollbar"
align="center"
>
<!-- 插槽位置 -->
<template #card="{ row }">
<i
v-if="row.CardId != null"
class="vxe-icon-check"
style="color: var(--el-color-success)"
></i>
<i
v-else
class="vxe-icon-close"
style="color: var(--el-color-error)"
></i>
</template>
</vxe-grid>
</div>
</template>
```
通过以上代码,父组件中定义的`#card`插槽内容会被动态插入到封装组件中的`<vxe-grid>`组件内部。
请注意,这里假设`#card`插槽是在父组件中定义并使用的。你可以根据实际情况修改插槽名称和用法。
阅读全文