Skip to content

Commit

Permalink
fix: FormTab components parseDefaultActiveKey (#802)
Browse files Browse the repository at this point in the history
  • Loading branch information
liuqiao1 authored Apr 16, 2020
1 parent 6635106 commit 2fb128b
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 21 deletions.
2 changes: 1 addition & 1 deletion docs/zh-cn/schema-develop/form-layout.md
Original file line number Diff line number Diff line change
Expand Up @@ -548,7 +548,7 @@ const App = () => (
actions={actions}
onSubmit={v => console.log(v)}
>
<FormTab name="tabs">
<FormTab name="tabs" defaultActiveKey={'tab-2'}>
<FormTab.TabPane name="tab-1" tab="选项1">
<Field
type="string"
Expand Down
2 changes: 1 addition & 1 deletion packages/antd-components/README.zh-cn.md
Original file line number Diff line number Diff line change
Expand Up @@ -2211,7 +2211,7 @@ const App = () => (
actions={actions}
onSubmit={v => console.log(v)}
>
<FormTab name="tabs">
<FormTab name="tabs" defaultActiveKey={'tab-2'}>
<FormTab.TabPane name="tab-1" tab="选项1">
<Field
type="string"
Expand Down
24 changes: 13 additions & 11 deletions packages/antd-components/src/form-tab/index.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { Fragment, useEffect } from 'react'
import React, { Fragment, useEffect, useRef } from 'react'
import {
createControllerBox,
ISchemaVirtualFieldComponentProps,
Expand Down Expand Up @@ -47,9 +47,11 @@ const parseTabItems = (items: any, hiddenKeys?: string[]) => {
}, [])
}

const parseDefaultActiveKey = (props: any, items: any) => {
const { defaultActiveKey } = props
return defaultActiveKey ? defaultActiveKey : items[0] && items[0].key
const parseDefaultActiveKey = (hiddenKeys: Array<string> = [], items: any, defaultActiveKey) => {
if(!hiddenKeys.includes(defaultActiveKey))return defaultActiveKey

const index = items.findIndex(item => !hiddenKeys.includes(item.key))
return index >= 0 ? items[index].key : ''
}

const parseChildrenErrors = (errors: any, target: string) => {
Expand Down Expand Up @@ -91,15 +93,16 @@ export const FormTab: React.FC<IVirtualBoxProps<IFormTab>> &
'tab',
({ form, schema, name, path }: ISchemaVirtualFieldComponentProps) => {
const orderProperties = schema.getOrderProperties()
let { hiddenKeys, ...componentProps } = schema.getExtendsComponentProps()
let { hiddenKeys, defaultActiveKey, ...componentProps } = schema.getExtendsComponentProps()
hiddenKeys = hiddenKeys || []
const [{ activeKey, childrenErrors }, setFieldState] = useFieldState<
ExtendsState
>({
activeKey: parseDefaultActiveKey(schema, orderProperties),
activeKey: parseDefaultActiveKey(hiddenKeys, orderProperties, defaultActiveKey),
childrenErrors: []
})
const items = parseTabItems(orderProperties, hiddenKeys)
const itemsRef = useRef([])
itemsRef.current = parseTabItems(orderProperties, hiddenKeys)
const update = (cur: string) => {
form.notify(StateMap.ON_FORM_TAB_ACTIVE_KEY_CHANGE, {
name,
Expand All @@ -111,9 +114,7 @@ export const FormTab: React.FC<IVirtualBoxProps<IFormTab>> &
useEffect(() => {
if (Array.isArray(hiddenKeys)) {
setFieldState({
activeKey: hiddenKeys.includes(activeKey)
? items[0] && items[0].key
: activeKey
activeKey: parseDefaultActiveKey(hiddenKeys, orderProperties, defaultActiveKey)
})
}
}, [hiddenKeys.length])
Expand All @@ -128,6 +129,7 @@ export const FormTab: React.FC<IVirtualBoxProps<IFormTab>> &
})
EffectHooks.onTabActiveKeyChange$().subscribe(
({ value, name, path }: any = {}) => {
if(!itemsRef.current.map(item => item.key).includes(value))return
matchUpdate(name, path, () => {
setFieldState({
activeKey: value
Expand All @@ -138,7 +140,7 @@ export const FormTab: React.FC<IVirtualBoxProps<IFormTab>> &
})
return (
<Tabs {...componentProps} activeKey={activeKey} onChange={update}>
{items.map(({ props, schema, key }) => {
{itemsRef.current.map(({ props, schema, key }) => {
const currentPath = FormPath.parse(path).concat(key)
return (
<Tabs.TabPane
Expand Down
2 changes: 1 addition & 1 deletion packages/next-components/README.zh-cn.md
Original file line number Diff line number Diff line change
Expand Up @@ -2195,7 +2195,7 @@ const App = () => (
actions={actions}
onSubmit={v => console.log(v)}
>
<FormTab name="tabs">
<FormTab name="tabs" defaultActiveKey={'tab-2'}>
<FormTab.TabPane name="tab-1" tab="选项1">
<Field
type="string"
Expand Down
20 changes: 13 additions & 7 deletions packages/next-components/src/form-tab/index.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { Fragment, useEffect } from 'react'
import React, { Fragment, useEffect, useRef } from 'react'
import {
createControllerBox,
ISchemaVirtualFieldComponentProps,
Expand Down Expand Up @@ -48,7 +48,9 @@ const parseTabItems = (items: any, hiddenKeys?: string[]) => {
}


const parseDefaultActiveKey = (hiddenKeys: Array<string> = [], items: any) => {
const parseDefaultActiveKey = (hiddenKeys: Array<string> = [], items: any, defaultActiveKey) => {
if(!hiddenKeys.includes(defaultActiveKey))return defaultActiveKey

const index = items.findIndex(item => !hiddenKeys.includes(item.key))
return index >= 0 ? items[index].key : ''
}
Expand Down Expand Up @@ -93,10 +95,13 @@ export const FormTab: React.FC<IVirtualBoxProps<IFormTab>> &
const [{ activeKey, childrenErrors }, setFieldState] = useFieldState<
ExtendsState
>({
activeKey: defaultActiveKey || parseDefaultActiveKey(hiddenKeys, orderProperties),,
activeKey: parseDefaultActiveKey(hiddenKeys, orderProperties, defaultActiveKey),
childrenErrors: []
})
const items = parseTabItems(orderProperties, hiddenKeys)

const itemsRef = useRef([])
itemsRef.current = parseTabItems(orderProperties, hiddenKeys)

const matchUpdate = createMatchUpdate(name, path)
const update = (cur: string) => {
form.notify(StateMap.ON_FORM_TAB_ACTIVE_KEY_CHANGE, {
Expand All @@ -108,7 +113,7 @@ export const FormTab: React.FC<IVirtualBoxProps<IFormTab>> &
useEffect(() => {
if (Array.isArray(hiddenKeys)) {
setFieldState({
activeKey: parseDefaultActiveKey(hiddenKeys, orderProperties)
activeKey: parseDefaultActiveKey(hiddenKeys, orderProperties, defaultActiveKey)
})
}
}, [hiddenKeys.length])
Expand All @@ -121,7 +126,8 @@ export const FormTab: React.FC<IVirtualBoxProps<IFormTab>> &
})
}
})
EffectHooks.onTabActiveKeyChange$().subscribe(({ value, name, path }) => {
EffectHooks.onTabActiveKeyChange$().subscribe(({ value, name, path }) => {
if(!itemsRef.current.map(item => item.key).includes(value))return
matchUpdate(name, path, () => {
setFieldState({
activeKey: value
Expand All @@ -136,7 +142,7 @@ export const FormTab: React.FC<IVirtualBoxProps<IFormTab>> &
activeKey={activeKey}
onChange={update}
>
{items.map(({ props, schema, key }) => {
{itemsRef.current.map(({ props, schema, key }) => {
const currentPath = FormPath.parse(path).concat(key)
return (
<Tab.Item
Expand Down

0 comments on commit 2fb128b

Please sign in to comment.