我想在我的Vue 3应用程序中动态创建一个SFC中的组件,并将其附加到DOM中。我使用的是<script setup>
样式的组件,这是另一个问题。
这似乎是不必要的困难。
以下是我大致想做的事情:
1.获取一些数据。明白。
1.创建Vue组件的示例:Foo.vue.
1.把数据作为 prop 交给它。
1.将其附加到DOM中我想要的位置。
问题是我不能在模板中执行〈component:is=“Foo:〉,因为我不知道它将在模板呈现很久之后的位置。
对此有什么最好的实践吗?一个简单的例子,一些善良的灵魂可以提供将是巨大的赞赏。
有一半的时间我不能从Vue文档中看出头绪。对不起,我不想这么说,但是它们对Vue的新手来说是相当不透明的,让我觉得很笨。
下面是一些模拟代码,说明了我想做的事情
import Foo from "../components/Foo.vue"
function makeAFoo(p, data){
// instantiate my Foo.vue (not sure how to do this inline), and pass it the data it needs
let foo = new Foo(data); // if only it were this simple, right?
// Append it to p (which is an HTML Element)
p.appendChild(foo)
}
3条答案
按热度按时间s2j5cfk01#
选项1:
createVNode(component, props)
和render(vnode, container)
**创建:**使用
createVNode()
来创建具有props的组件定义的VNode
(例如,从*.vue
导入的SFC),其可以被传递到render()
以在给定容器元素上呈现它。**销毁:**调用
render(null, container)
将销毁附加到容器的VNode
。在父组件卸载时(通过unmounted
生命周期挂接),应将此调用作为清理。**警告:**此方法依赖于内部方法(
createVNode
和render
),在未来版本中可能会重构或删除这些方法。demo 1
选项2:
createApp(component, props)
和app.mount(container)
**正在创建:**使用
createApp()
,它返回一个应用程序示例。该示例具有mount()
,可用于呈现给定容器元素上的组件。**销毁:**应用程序示例具有
unmount()
以销毁应用程序和组件示例。在父组件卸载时(通过unmounted
生命周期挂接),应将此调用为清理。**警告:**这种方法为每个组件创建一个应用程序示例,如果需要在文档中同时示例化许多组件,那么这可能会带来不小的开销。
demo 2
用法示例
hxzsmxv22#
更简单的方法是使用v-if或v-for。
与直接处理组件不同,您可以处理组件的状态,并让VueReact性发挥作用
下面是一个动态附加组件(吐司)的示例,同时只操作组件的状态
吐司.vue文件:v-for在这里是被动的,每当一个新的错误被添加到错误的对象中时,它就会被呈现
错误触发值:在这里,每当单击发生时,我们都会将错误推送到错误的对象
完整示例如下:https://stackblitz.com/edit/vitejs-vite-mcjgkl
3yhwsihp3#
mount-vue-component包提供了一个helper函数,该函数使用@tony19答案中的选项1。
一个警告:如果组件是在
.vue
文件中定义的,并且只是通过编程创建的,那么您可能需要导入并注册它,否则树抖动可能会删除它的模板,导致在生产时插入一个空组件(这个问题似乎主要影响Vue + Vite)。例如: