渲染前访问儿童道具

时间:2019-12-17 18:23:40

标签: reactjs typescript children react-props

我正在构建一个向导/步骤组件,其中每个子组件都是一个步骤,步骤组件找到应显示的当前步骤并将其包装在提供程序中。

下一步,我要实现的是在所有步骤中都要渲染的组件。在渲染之前,我先通过子组件的props来实现,这样我就可以像这样使用组件了:

    <Steps >
        <Text> Step 1 </Text> 
        <Text> Step 2 </Text>
        <Text stepless > Stepless </Text>
    </Steps>

我是通过这样编码Steps组件来实现的。

export const Steps: React.FC<types.Steps> = ({ step = 0, ...properties }) => {

    /**
     * Global state that store the total number of steps and the current step
     */
    const steps = React.Children.count(properties.children)
    const [state, dispatch] = useReducer(reducer, { step, steps })

    /**
     * Function that will let child components to change the current step
     */
    const next = () => dispatch(types.Action.NEXT)
    const previous = () => dispatch(types.Action.PREVIOUS)

    /**
     * Value to provide to the provider
     * next and previous function to change the current step
     * and the current step
     */
    const value = { next, previous, step: state.step }

    /**
     * Filter the child components that should be shown
     */
    const children = React.Children.toArray(properties.children)
        .filter((child, index) =>
            // @ts-ignore
            (index === state.step) || child?.props.stepless
        )

    return (
        <Context.Provider value={value} >
            { children.map((child, index) => <div key={ index } > { child } </div>) }
        </Context.Provider>
    )
}

但是此代码对我来说很臭,因为child?.props不是反应类型的一部分,这使我相信它是在内部使用的,我不应该使用它,但是我没有找到其他解决方案来过滤那些应该显示在所有步骤上。

我正在寻找一种不同的方式来实现相同的行为,而不使用//@ts-ignore

0 个答案:

没有答案