我正在构建一个向导/步骤组件,其中每个子组件都是一个步骤,步骤组件找到应显示的当前步骤并将其包装在提供程序中。
下一步,我要实现的是在所有步骤中都要渲染的组件。在渲染之前,我先通过子组件的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
。