文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

ComponentLoader 与动态组件实例详解

2023-05-19 11:05

关注

引言

组件通过 <Canvas /> 渲染在画布上,内容完全由组件树 componentTree 驱动,但也有一些情况我们需要把某个组件实例渲染到组件树之外,比如全屏、置顶等场景,甚至有些时候我们要渲染一个不在组件树中的临时组件,却要拥有一系列画布能力。

为了让组件渲染更灵活,我们暴露出 <ComponentLoader> API:

import { createDesigner } from 'designer'
const { Designer, Canvas, ComponentLoader } = createDesigner()
const App = () => {
  return (
    <Designer componentTree={}>
      <Canvas />
      {}
      <ComponentLoader />
    </Designer>
  )
}

组件加载器有三种用法:按组件 ID 加载、按组件树路径加载、动态组件,下面分别介绍。

按组件 ID 加载

将组件树上的某个组件渲染到任何地方,即一个组件实例渲染到 N 个地方,实例级别信息共享,渲染为 N 份:

<ComponentLoader componentId="input1" />

如上例子,将组件 ID 为 input1 的组件渲染到目标位置。

甚至可以在组件内套组件,比如我们定义一个容器组件,内置渲染 ID 为 input1 的子组件:

const container: ComponentMeta = {
  componentName: 'container',
  // 组件 props 会自动注入 ComponentLoader
  element: ({ ComponentLoader, children }) => {
    return (
      <div>
        <ComponentLoader componentId="input1" />
        {children}
      </div>
    )
  }
}

当该组件 ID 在组件树中被移除时,<ComponentLoader componentId="input1" /> 返回 null

按组件树路径加载

如果组件在组件树上没有 ID,或者你希望固定渲染某个位置的组件,而无论组件树如何变化,那么就可以采用按组件树路径的加载模式,将 componentId 替换为 treePath 即可:

<ComponentLoader treePath="children.0" />

如上例子,渲染的是 componentTree 根节点 children.0 位置的子组件,同样,但组件不存在时返回 null

动态组件

如果要渲染一个不存在于组件树的组件实例,还可以这么用 <ComponentLoader />:

<ComponentLoader standalone componentName="card" />

即添加 standalone 表示它为一个 “孤立” 组件,即不存在于组件树的组件,以及 componentName 指定组件名。

之所以不需要指定 componentId,是因为每个 ComponentLoader 此时都是一个唯一的实例,在 designer 内部会自动分配一个固定的组件 ID。

这么设计非常灵活,但实现起来难度是有一些,主要注意两点:

对于动态组件,我们还可以传递更多参数:

<ComponentLoader standalone componentName="chart" props={{ color: 'red' }}>
  <button>click</button>
</ComponentLoader>

如上例子,我们传了额外 props 属性,以及一个子元素给 chart 组件实例。

特别的,如果传递了 componentId,可以将该动态组件的 ID 固定下来,方便进行联动:

<ComponentLoader standalone componentName="chart" componentId="abc" />

但动态组件也有一些限制,如下:

总结

其实 <Canvas /> 根节点本质上等价于 <ComponentLoader treePath="" />,即从根节点开始渲染一个组件实例。

所以提供 ComponentLoader 势必会让业务能力更灵活,在任意位置渲染组件,甚至渲染一个不存在于组件树的动态组件。

讨论地址是:精读《ComponentLoader 与动态组件》· Issue #482 · dt-fe/weekly

以上就是ComponentLoader 与动态组件实例详解的详细内容,更多关于ComponentLoader 动态组件的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯