设置器扩展

设置器简述

设置器主要用于低代码组件属性值的设置,顾名思义叫”设置器”,又称为 Setter。由于组件的属性有各种类型,需要有与之对应的设置器支持,每一个设置器对应一个值的类型。

设计器展示位置

设置器展示在编辑器的右边区域,如下图:

设置器扩展 - 图1

其中包含四类设置器:

  • 属性:展示该物料常规的属性
  • 样式:展示该物料样式的属性

  • 事件:如果该物料有声明事件,则会出现事件面板,用于绑定事件。

  • 高级:两个逻辑相关的属性,条件渲染循环

设置器类型

上述区域中是有多项设置器的,对于一个组件来说,每一项配置都对应一个设置器,比如我们的配置是一个文本,我们需要的是文本设置器,我们需要配置的是数字,我们需要的就是数字设置器。

下图中的标题和按钮类型配置就分别是文本设置器和下拉框设置器。

设置器扩展 - 图2

我们提供了常用的设置器作为内置设置器,也提供了定制能力帮助大家开发特定需求的设置器。

为物料配置设置器

我们提供了常用的设置器作为内置设置器。

我们可以将目标组件的属性值类型值配置到物料资源配置文件中:

  1. {
  2. "componentName": "Message",
  3. "title": "Message",
  4. "props": [
  5. {
  6. "name": "type",
  7. "propType": {
  8. "type": "oneOf",
  9. "value": [
  10. "success",
  11. "warning",
  12. "error",
  13. "notice",
  14. "help",
  15. "loading"
  16. ]
  17. },
  18. "description": "反馈类型",
  19. "defaultValue": "success"
  20. }
  21. ],
  22. "configure": {
  23. "props": {
  24. "isExtends": true,
  25. "override": [
  26. {
  27. "name": "type",
  28. "setter": "InputSetter"
  29. }
  30. ]
  31. }
  32. }
  33. }

props 字段是入料模块扫描自动填入的类型,用户可以通过 configure 节点进行配置通过 override 节点对属性的声明重新定义,setter 就是注册在引擎中的 setter。

为物料配置引擎内置的 setter 时,均可以使用对应 setter 的高级功能,对应功能参考“全部内置设置器”章节下的对应 setter 文章。

对高级功能的配置如下:

例如我们需要在NumberSetter中配置units属性,可以在asset.json中声明

  1. "configure": {
  2. "component": {
  3. "isContainer": true,
  4. "nestingRule": {
  5. "parentWhitelist": [
  6. "NextP"
  7. ]
  8. }
  9. },
  10. "props": [
  11. {
  12. "name": "width",
  13. "title": "宽度",
  14. "initialValue": "auto",
  15. "defaultValue": "auto",
  16. "condition": {
  17. "type": "JSFunction",
  18. "value": "() => false"
  19. },
  20. "setter": {
  21. "componentName": "NumberSetter",
  22. "props": {
  23. "units": [
  24. {
  25. "type": "px",
  26. "list": true
  27. },
  28. {
  29. "type": "%",
  30. "list": true
  31. }
  32. ]
  33. }
  34. }
  35. },
  36. ],
  37. "supports": {
  38. "style": true
  39. }
  40. },

自定义设置器

编写 AltStringSetter

我们编写一个简单的 Setter,它的功能如下:

设置器扩展 - 图3

代码如下:

  1. import * as React from "react";
  2. import { Input } from "@alifd/next";
  3. import "./index.scss";
  4. interface AltStringSetterProps {
  5. // 当前值
  6. value: string;
  7. // 默认值
  8. defaultValue: string;
  9. // setter唯一输出
  10. onChange: (val: string) => void;
  11. // AltStringSetter 特殊配置
  12. placeholder: string;
  13. }
  14. export default class AltStringSetter extends React.PureComponent<AltStringSetterProps> {
  15. componentDidMount() {
  16. const { onChange, value, defaultValue } = this.props;
  17. if (value == undefined && defaultValue) {
  18. onChange(defaultValue);
  19. }
  20. }
  21. // 声明Setter的title
  22. static displayName = 'AltStringSetter';
  23. render() {
  24. const { onChange, value, placeholder } = this.props;
  25. return (
  26. <Input
  27. value={value}
  28. placeholder={placeholder || ""}
  29. onChange={(val: any) => onChange(val)}
  30. ></Input>
  31. );
  32. }
  33. }

setter 和 setter/plugin 之间的联动

我们采用 emit 来进行相互之前的通信,首先我们在 A setter 中进行事件注册:

  1. import { event } from '@alilc/lowcode-engine';
  2. componentDidMount() {
  3. // 这里由于面板上会有多个setter,这里我用field.id来标记setter名
  4. this.emitEventName = `${SETTER_NAME}-${this.props.field.id}`;
  5. event.on(`${this.emitEventName}.bindEvent`, this.bindEvent)
  6. }
  7. bindEvent = (eventName) => {
  8. // do someting
  9. }
  10. componentWillUnmount() {
  11. // setter是以实例为单位的,每个setter注销的时候需要把事件也注销掉,避免事件池过多
  12. event.off(`${this.emitEventName}.bindEvent`, this.bindEvent)
  13. }

在 B setter 中触发事件,来完成通信:

  1. import { event } from '@alilc/lowcode-engine';
  2. bindFunction = () => {
  3. const { field, value } = this.props;
  4. // 这里展示的和插件进行通信,事件规则是插件名+方法
  5. event.emit('eventBindDialog.openDialog', field.name, this.emitEventName);
  6. }

修改同级 props 的其他属性值

setter 本身只影响其中一个 props 的值,如果需要影响其他组件的 props 的值,需要使用 field 的 props:

  1. bindFunction = () => {
  2. const { field, value } = this.props;
  3. const propsField = field.parent;
  4. // 获取同级其他属性showJump的值
  5. const otherValue = propsField.getPropValue('showJump');
  6. // set同级其他属性showJump的值
  7. propsField.setPropValue('showJump', false);
  8. }

注册 AltStringSetter

我们需要在低代码引擎中注册 Setter,这样就可以通过 AltStringSetter 的名字在物料中使用了。

  1. import AltStringSetter from './AltStringSetter';
  2. const registerSetter = window.AliLowCodeEngine.setters.registerSetter;
  3. registerSetter('AltStringSetter', AltStringSetter);

物料中使用

我们需要将目标组件的属性值类型值配置到物料资源配置文件中,其中核心配置如下:

  1. {
  2. "props": {
  3. "isExtends": true,
  4. "override": [
  5. {
  6. "name": "type",
  7. "setter": "AltStringSetter"
  8. }
  9. ]
  10. }
  11. }

在物料中的相关配置如下:

  1. {
  2. "componentName": "Message",
  3. "title": "Message",
  4. "props": [
  5. {
  6. "name": "title",
  7. "propType": "string",
  8. "description": "标题",
  9. "defaultValue": "标题"
  10. },
  11. {
  12. "name": "type",
  13. "propType": {
  14. "type": "oneOf",
  15. "value": [
  16. "success",
  17. "warning",
  18. "error",
  19. "notice",
  20. "help",
  21. "loading"
  22. ]
  23. },
  24. "description": "反馈类型",
  25. "defaultValue": "success"
  26. }
  27. ],
  28. "configure": {
  29. "props": {
  30. "isExtends": true,
  31. "override": [
  32. {
  33. "name": "type",
  34. "setter": "AltStringSetter"
  35. }
  36. ]
  37. }
  38. }
  39. }