vue 如何用模板描述较为复杂的动态结构?

231 天前
 WarlockMan
传统的 js 思想是用指令把 dom 结构动态生成出来,
声名式思想则是用模板语法把 dom 结构"描述"出来,

但如果遇到这类情景,该怎么做呀?

情景:dom 结构无法在运行前就确定,而是需要在运行时,根据数据的不同,动态确定结构,
而且结构可能没有规律性,这导致难以用模板去预先"描述"结构,
传统 js 做法是通过迭代数据,动态生成 dom ,指令式思想在这方面比较灵活,

虽然在 vue 的<script>代码区内,也可以用传统 js 代码来动态生成标准 html 元素来动态操作 dom:

const div = document.createElement('div')
parentElement.append(div)

这样就能动态生成元素,并动态增加和插入元素到 dom ,

但如果我们想要动态创建的不是原生标准 html 元素,而是一个 vue 组件,那该怎么办呢?
我想在 vue 的<script setup>代码区内,实现类似的行为:

import 'Child' from 'Child.vue'

const child_vue_component = new Child()
parent_vue_component.append(child_vue_component)

我想实现类似这样的效果该怎么做呀?


我知道的可能跟这种情景沾边的东西是 vue 的 动态组件 和 异步组件,
可模板终归是只适合描述 运行前就确定 的结构,
如果遇到 运行前无法确定的 DOM 结构,或许还是需要一套指令式 api 来动态操作组件树

一个典型的例子是 TreeView 结构,它同时满足:
1.存在父子组件关系(嵌套关系?)
2.运行时才能确定结构

虽然网上的答案都是在模板语法中用递归组件自身来描述这种特殊结构,
但这也太幸运了,递归恰巧可以"描述"树状结构,但如果情景再复杂些,再多变些,
模板描述肯定会有遇到局限的时候不是么。
939 次点击
所在节点    问与答
5 条回复
jazzg62
231 天前
{
component:{
component1:()=>import('./component1.vue')
}
}
异步组件,然后还是循环去根据条件显示组件。似乎这样就可以实现你的需求,但是我没有实践过,你可以试试
paopjian
231 天前
插槽
JSX
haah
231 天前
答案:跳出模板思维。
Charrlles
231 天前
用渲染函数,vue 模板本质上也是渲染函数
pavlos
231 天前
组件构建成 js 文件,下载挂载上

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1024176

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX