Skip to content

常见问题解答 (FAQ)

为什么有些组件 column 没有 slots?

slot 一般用在模板(html)代码中,是常用的内容定制机制。但在 column(js) 配置中,如果对应的 props 中已经存在相应的属性,则不再定义 slot,这样可以使配置更加单一。

示例:从 slot 到 props 的转换

模板中使用 slot 的方式:

vue
<Comp>
  <template #prefix>
    <div>prefix</div>
  </template>
</Comp>

在 column 中推荐的 props 方式:

js
// 转为 props 定义
const column = {
  type: "comp",
  props: {
    prefix: () => <div>prefix</div>,
  },
};

INFO

column 保留了 slot 的定义,如果要用 slots 时,也可以在定义组件时,声明和使用 slots

tsx
<script setup lang="tsx">
export interface FtFormColumnInput<T extends Record<string, any>>
  extends AntdColumnBase<T> {
  /**
   * 输入框
   */
  type: "input";
  props?: Refs<InputProps>;
  slots?: {
    /** 某个插槽 */
    slotName: ({ value, isView, scopedProps }) => VNodeChild;
  };
}

export default defineFormComponent<FtFormColumnInput<any>>(props => {
  const { valueComputed, slots } = useFormItem({ props });

  return () => {
    return <Component>{slots}</Component>;
  };
});
</script>

为什么对于 fields 解构的值,valueGetter 中的参数是一个包含 undefined 的数组?

为了保持解构值一一对应,value 的值是一个与 fields 长度相同的数组,如果某个字段在 Form 中没有值,则会被设置为 undefined。对其进行处理时,可能需要先处理 undefined 的值。

ts
const column = {
  fields: ["a", "_", "b"],
  valueGetter(list) {
    // 默认 [undefined, undefined, undefined]
    const arr = list?.forEach(v => {
      if (v == null) {
        // ...
      }
      // ...
    });
    // 其他业务逻辑
    return arr;
  },
};

Released under the MIT License.