alibaba / lowcode-engine

An enterprise-class low-code technology stack with scale-out design / 一套面向扩展设计的企业级低代码技术体系
https://lowcode-engine.cn
MIT License
14.68k stars 2.55k forks source link

如何正确实现props属性值与setter value的联动 #1345

Open hzwjz opened 1 year ago

hzwjz commented 1 year ago

我想实现listSetter的value跟另一个props属性值联动

例如 listSetter 的 value 根据 props.setting的值来重新生成数组

目前代码是这么写的

<ListSetter
            ref={(ref) => {
              if (ref) {
                const settings = this.getProps().getPropValue('settingId');
                const columns = this.getProps().getPropValue('columns');

                if (settings) {
                  const { tableRules } = settings; // 列字段配置

                  // 检查是否有变化
                  if (!isTableRulesChange(columns, tableRules)) {
                    return;
                  }

                  const options = mergeColumns(columns, tableRules); // 将列字段配置 和 列其他配置 合并

                  ref.list.prop.setHotValue(options);
                  ref.list.updateItems(ref.list.prop);
                  ref.forceUpdate();
                }
              }
            }}
            descriptor={getDescriptor('title')}
            checkField={null}
            addable={false}
            deletable={false}
            draggable={false}
            editable
            display="drawer"
            configure={[
              {
                name: 'id',
                title: 'ID',
                display: 'none',
                editable: false,
                setter: <TextSetter readOnly />,
              },
              {
                name: 'title',
                title: '标题',
                display: 'inline',
                initialValue: '',
                editable: false,
                setter: <TextSetter readOnly />,
              },
              {
                name: 'dataKey',
                title: '数据字段',
                display: 'inline',
                initialValue: '',
                editable: false,
                setter: <TextSetter readOnly />,
              },
              {
                name: 'width',
                title: '宽度',
                display: 'inline',
                initialValue: 200,
                setter: (
                  <NumberSetter
                    units={[
                      {
                        type: 'px',
                        list: true,
                      },
                      {
                        type: '%',
                        list: true,
                      },
                    ]}
                  />
                ),
                supportVariable: true,
              },
              {
                name: 'align',
                title: '对齐方式',
                display: 'inline',
                initialValue: 'left',
                setter: (
                  <ChoiceSetter
                    options={[
                      { value: 'left', title: '居左' },
                      { value: 'center', title: '居中' },
                      { value: 'right', title: '居右' },
                    ]}
                  />
                ),
                supportVariable: true,
              },
              {
                name: 'lock',
                title: '列固定',
                display: 'inline',
                initialValue: 'none',
                setter: (
                  <ChoiceSetter
                    options={[
                      { value: 'none', title: '无' },
                      { value: 'left', title: '左' },
                      { value: 'right', title: '右' },
                    ]}
                  />
                ),
                supportVariable: true,
              },
              {
                name: 'sortable',
                title: '显示排序',
                display: 'inline',
                initialValue: false,
                setter: <BoolSetter />,
                supportVariable: true,
              },
              {
                name: 'hidden',
                title: '是否隐藏',
                display: 'inline',
                initialValue: false,
                setter: <BoolSetter />,
                supportVariable: true,
              },
              {
                name: 'groupName',
                title: '分组标题',
                display: 'inline',
                initialValue: '',
                setter: <TextSetter />,
                supportVariable: true,
              },
              {
                name: 'render',
                title: '内容定制渲染',
                display: 'accordion',
                setter: (
                  <ActionSetter
                    defaultCode={`/**
       * 表格列自定义渲染
       * @param value 当前列的数据
       * @param index 当前行所在的行号
       * @param rowData 当前行的数据
       */
      function renderCell(value, index, rowData) {
        return <span>{value}</span>;
      }`}
                    defaultActionName="renderCell"
                  />
                ),
              },
            ]}
          />

Expected behavior (required) / 预期行为(必填,非常重要)

在settingId中的tableRules变化时,listSetter的value也可以实时变化

Screenshots (optional) / bug 截图(可选)

但现在的现象是偶尔会变化,不是每一次listSetter都会重新渲染

Environments (please complete the following information) (required): / 请提供如下信息(必填)

hzd822 commented 1 year ago

https://lowcode-engine.cn/site/docs/guide/expand/editor/setter

jerrywu001 commented 1 year ago

如何在物料组件内部修改它自身定义的props, 很重要!!!!!!!

比如组件内部定义了个props: articleInfo ---> string, 并且包含按钮,点击之后更新articleInfo

helloworldcdd commented 1 year ago

ArraySetter 会有这个问题,target.parent.setPropsValue('XX',[]) value已经改了,但是dom没有渲染
其他类型暂时未发现