setup()

in packages/element/src/form-collapse/index.ts [109:191]


    setup(props, { attrs, emit }) {
      const field = useField()
      const schema = useFieldSchema()
      const prefixCls = `${stylePrefix}-form-collapse`
      const _formCollapse = computed(
        () => props.formCollapse ?? createFormCollapse()
      )

      const takeActiveKeys = (panels: Panels) => {
        if (props.activeKey) return props.activeKey
        if (_formCollapse.value?.activeKeys)
          return _formCollapse.value?.activeKeys
        if (attrs.accordion) return panels[0]?.name
        return panels.map((item) => item.name)
      }

      const badgedHeader = (key: SchemaKey, props: any) => {
        const errors = field.value.form.queryFeedbacks({
          type: 'error',
          address: `${field.value.address.concat(key)}.*`,
        })
        if (errors.length) {
          return h(
            Badge,
            {
              class: [`${prefixCls}-errors-badge`],
              props: {
                value: errors.length,
              },
            },
            { default: () => props.title }
          )
        }
        return props.title
      }

      return () => {
        const panels = usePanels(field.value, schema.value)
        const activeKey = takeActiveKeys(panels)
        return h(
          Collapse,
          {
            class: prefixCls,
            props: {
              value: activeKey,
            },
            on: {
              change: (key: string | string[]) => {
                emit('input', key)
                _formCollapse.value.setActiveKeys(key)
              },
            },
          },
          {
            default: () => {
              return panels.map(({ props, schema, name }, index) => {
                return h(
                  CollapseItem,
                  {
                    key: index,
                    props: {
                      ...props,
                      name,
                    },
                  },
                  {
                    default: () => [
                      h(RecursionField, { props: { schema, name } }, {}),
                    ],
                    title: () =>
                      h(
                        'span',
                        {},
                        { default: () => badgedHeader(name, props) }
                      ),
                  }
                )
              })
            },
          }
        )
      }
    },