Skip to main content

组件化

使用场景

把设计稿上传到 CodeFun 平台之后,这时直接查看/下载代码,只能得到由 View/Text/Image 组成的静态页面,不具备交互能力。 而通常我们需要在页面上收集用户输入、提供反馈、展示动态数据 等,以此来达到与用户的动态交互,从而实现所需的业务逻辑。 又或者团队内部已经有了一批通用的公共组件,如何将这些组件与 CodeFun 打通,在生成代码时自动生成组件代码呢?

为此,我们提供了组件化能力,可以自定义常见组件(输入框、单选/多选框等)、高级组件(日历、进度条等),或关联已有组件。

视频教程

tabs 组件视频教程

tabs 组件教程

常用表单视频教程

常用表单教程

自定义组件视频教程

自定义组件教程

使用教程

本节教程以 微信小程序 平台 和 Vant Weapp UI 库 为模版进行示例说明。

定义组件

  1. 创建组件库:CodeFun 首页 -> 个人空间或团队空间 -> 组件库 -> 添加组件库

创建组件库

字段说明:

  • 名称:用于展示,方便用户区分不同的组件库
  • 代码平台:该组件库所适用的代码平台(在微信小程序平台标记的组件,当切换到 Vue 平台时会被忽略)
  • 所属团队:设置组件库的可见范围
  • 全局样式:可选,添加自定义全局样式,生成代码时会统一生成到全局样式中
  1. 创建组件:点击已创建的组件库 -> 组件库详情页 -> 添加组件

创建组件

组件库详情页包含:左侧的组件树以及右侧的组件详情
一个组件库可以包含多个组件,每个组件又可以创建自己的子组件,这样组件库内所有的组件就组成了一个树状结构。

组件树

本质上每个组件以标签的形式存在,当一个节点被标记之后,也会展示相应的标签,目前的标签有以下 3 种类型:

  • 组件:包含依赖、编译模版、属性等配置项,是生成代码的入口
  • 属性提取器:与某个组件属性绑定,当标记该标签时自动提取值到指定的属性
  • Slot:根据组件的编译模版配置,来参与最终的代码生成

目前 CodeFun 支持以下 3 种表达式语法,这些语法将在配置组件模版、属性时使用到:

  • 自定义属性表达式:$.props.x,获取组件已定义的属性 x 对应的值

  • DOM 属性表达式:$.x,获取 DOM 节点的属性 x 对应的值(DOM 节点指的是设计稿详情页左侧 DOM 树上的节点,大部分时候这些节点属性供内部使用,这里仅开放部分属性供组件化使用)

    // 节点坐标信息
    interface UIFrame {
    left: number // x 轴坐标
    top: number // y 轴坐标
    width: number // 宽度
    height: number // 高度
    }

    // DOM 节点通用属性
    interface UIDOMNode {
    _id: string // 节点 id
    type: string // 节点类型:View/Text/Image
    frame: UIFrame // 相对于父节点的坐标信息
    absFrame: UIFrame // 对于设计稿左上原点的坐标信息
    style: Record<string, string> // 节点样式信息,以驼峰形式命名的 css 属性,例如:{ fontSize: 12px }
    }

    // View 节点
    interface UIViewNode extends UIDOMNode {
    children: UIDOMNode[] // 孩子节点
    }

    // Text 节点
    interface UITextNode extends UIDOMNode {
    text: string // 文本内容
    }

    // Image 节点
    interface UIImageNode extends UIDOMNode {
    src: string // 图片 url
    }
  • 标签选择表达式:$('x y'),获取标记了 x 或 y 的 DOM 节点(这里的 DOM 节点同上),多个标签以空格分隔

    标签的使用场景和定义

  • 组件标签:将节点按照自定义模版生成代码,顶层标签必须是组件标签

    组件标签

    字段说明:

    • 名称:用于展示,标记节点之后也会在 DOM 树上展示对应的标签名称
    • 智能识别:可选,关联智能标签,可以实现自动标记和智能处理,详情参照智能组件
    • 依赖导入:可选,配置第三方依赖或本地依赖(设置了依赖导入,就需要配置相关的依赖设置项)
    • 导入名称:导入的组件名
    • 是否解构导入:是否解构导入组件名,例如:解构 import { name} from 'x',非解构 import name from 'x'
    • 导入路径:组件所在位置,第三方 npm 包路径或本地路径
    • Npm 包名:导入的组件所在的 npm 包名
    • Npm 版本:npm 包版本号,默认 *,用于生成 package.json 中的依赖项
    • 编译模版:可选,为空时不生成代码,需要是合法的 xml 语法,可嵌套任意层级,包含普通标签和指令标签
      • 普通标签:会被原样生成到代码中,属性值支持 自定义属性表达式DOM 属性表达式
      • 指令标签:内部指令,会按照特殊规则进行代码生成,有以下指令标签
        • cf-slot: 根据 cf-content 指令属性获取到的 DOM 节点进行代码生成,cf-content 支持 DOM 属性表达式标签选择表达式,其他属性按照普通属性生成
    • 属性:组件配置项,主要用于编译模版中的属性绑定,目前有 4 种属性:输入框、布尔值、下拉选项、颜色,属性默认值支持 DOM 属性表达式
  • 属性提取器标签:通过打标签的方式自动提取值到组件属性,简化手动填写属性值的繁琐

    属性提取器标签

    • 名称:用于展示,同组件标签名称
    • 关联属性:关联自动提取的目标属性,当标记该标签时,会根据 提取表达式 获取到的值自动赋值到关联属性上
    • 提取表达式:支持 DOM 属性表达式
  • Slot 标签:主要用于筛选节点,将标记了该标签的节点插入到组件编译模版的指定位置

    slot标签

    • 名称:用于展示,同组件标签名称

标记组件

  1. 标记组件:进入设计稿页面 -> 选中要标记的节点 -> 打开标记组件面板 -> 标记组件
  2. 查看代码:标记的组件节点已按照组件定义进行代码生成

标记组件

温馨提示:

  • 一个节点可以标记多个标签,当两个 组件标签 同时出现在节点上时,会以第一个 组件标签 的编译模版进行代码生成。

样式还原

生成组件代码时如果按照设计稿进行样式还原,就需要深层次的样式穿透、覆盖,由于各 UI 库自定义样式规则不同,很难提供统一模式的样式还原。
根据常用的开发流程,大多数公司内部有统一的组件风格,会针对 UI 库自带的主题样式进行全局配置、覆盖,实现自定义样式的修改。
基于以上两点,目前组件化在样式还原上遵循以下原则:

  1. 只保留组件位置样式(left、right、margin、flex、alignSelf 等),其他样式全部丢弃(width、padding、color 等)
  2. 在组件库中配置全局样式,实现样式统一、覆盖

官方组件

为了提供开箱即用的组件化功能,目前官方提供以下组件库:

  1. 各个平台的基础组件库
  2. weapp(微信小程序)原生组件
  3. taro(Vue)原生组件
  4. uniapp 原生组件
  5. vant-weapp,基于 Vant Weapp 的微信小程序组件库
  6. uView1.0,基于 uView UI 的 uni-app 组件库

以上组件库对所有用户可见,未来还会上线更多..

智能组件

  • 标记页面顶部的 Header 栏,滚动时固定在顶部
  • 如果节点不在顶部,会被移动到顶部,以便形成合理的布局,将节点固定在顶部
  • 每个页面只能标记一个 Header
  • 生成微信小程序代码时,自动生成导航栏配置

ai-header

  • 标记页面底部的 Footer 栏,滚动时固定在底部
  • 如果节点不在底部,会被移动到底部,以便形成合理的布局,将节点固定在底部

Fixed

  • 标记需要固定位置的节点,滚动时位置固定不变
  • 如果节点位置不对,会将节点移动到根节点下,以便形成合理的布局,将节点固定在页面某个位置

List

  • 标记 List 节点
  • 自动识别内部的 ListItem 节点,并标记为 ListItem
  • 生成代码时,根据 将 List 标签输出为循环列表 开关进行智能生成

ai-list

Grid

  • 标记 Grid 节点,自动调整内部节点位置,形成更好的 Grid 布局模式
  • 自动识别内部的 GridItem 节点,并标记为 GridItem
  • 自动生成 grid 样式