import React, { forwardRef, useMemo } from 'react'; import { View } from 'react-native'; import isFunction from 'lodash-es/isFunction'; import { useControllableValue, useMemoizedFn } from '../hooks'; import { TabsContext, TabsContextState } from './TabsContext'; import TabsBar from './TabsBar'; import TabsContent from './TabsContent'; import { parseChildList } from './utils'; import type { TabsProps, TabPaneProps } from './type'; const Tabs = forwardRef((props, ref) => { const { children, style } = props; const [currentIndex, setCurrentIndex] = useControllableValue(props, { defaultValue: 0, valuePropName: 'active', trigger: 'onChange', }); const childrenList = useMemo(() => parseChildList(children), [children]); const beforeChange = useMemoizedFn((idx: number): Promise => { return Promise.resolve(isFunction(props.beforeChange) ? props.beforeChange(idx) : true); }); const handleTabChange = useMemoizedFn(async (idx: number) => { const couldChange = await beforeChange(idx); couldChange && setCurrentIndex(idx); }); const contextState = useMemo( () => ({ props, selectedIndex: currentIndex, setCurrentIndex: handleTabChange, }), [currentIndex, props] ); return ( {childrenList.map((item, index) => React.cloneElement(item.node, { index }))} ); }); Tabs.defaultProps = { type: 'line', duration: 300, ellipsis: true, lazyRender: true, align: 'center', }; export default Tabs;