[英]Too many re-renders error. Using React Hooks with a Stepper component
I have a Stepper component that receives a prop called step我有一个 Stepper 组件,它接收一个名为 step 的道具
export default function HorizontalLinearStepper({ step }) {
const classes = useStyles()
const [activeStep, setActiveStep] = React.useState(0)
const steps = getSteps()
return (
<div className={classes.root}>
<Stepper
activeStep={step}
connector={<ColorlibConnector />}
alternativeLabel
>
{steps.map(label => (
<Step key={label}>
<StepLabel
StepIconProps={{
classes: { root: classes.stepIcon },
}}
>
{label}
</StepLabel>
</Step>
))}
</Stepper>
</div>
)
}
I need to set the property activeStep according to my step prop, something like this:我需要根据我的 step 属性设置属性 activeStep,如下所示:
if (step === 0) {
setActiveStep(0)
} else if (step === 1) {
setActiveStep(0)
} else if (step === 2) {
setActiveStep(2)
} else if (step === 3) {
setActiveStep(3)
} else if (step === 4) {
setActiveStep(4)
} else if (step === 5) {
setActiveStep(4)
}
The code above throw an error: "Too many re-renders. React limits the number of renders to prevent an infinite loop."上面的代码抛出一个错误:“重新渲染太多。React 限制了渲染的数量以防止无限循环。”
What is the best way to do this?做这个的最好方式是什么?
You should use useEffect to react (no pun) to any change in step
:您应该使用useEffect对
step
中的任何更改做出反应(没有双关语):
export default function HorizontalLinearStepper({ step }) {
const classes = useStyles()
const [activeStep, setActiveStep] = React.useState(step)
const steps = getSteps()
React.useEffect(() => {
setActiveStep(step)
}, [step])
return (
<div className={classes.root}>
<Stepper
activeStep={step}
connector={<ColorlibConnector />}
alternativeLabel
>
{steps.map(label => (
<Step key={label}>
<StepLabel
StepIconProps={{
classes: { root: classes.stepIcon },
}}
>
{label}
</StepLabel>
</Step>
))}
</Stepper>
</div>
)
}
Don't know where you getSteps
from, maybe you should pass that in props too.不知道你从哪里
getSteps
,也许你也应该在道具中传递它。
Oh god, silly me.哦,天哪,我傻了。
I dont need another state for my stepper component, I can just manipulate the step props, like this (not very pleasing, but its working)我的步进器组件不需要另一个 state,我可以像这样操纵步进道具(不是很令人愉快,但它可以工作)
export default function HorizontalLinearStepper({ step }) {
const classes = useStyles()
const steps = getSteps()
if (step === 0) {
step = 0
} else if (step === 1) {
step = 0
} else if (step === 2) {
step = 1
} else if (step === 3) {
step = 2
} else if (step === 3) {
step = 2
} else if (step === 4) {
step = 3
} else if (step === 5) {
step = 4
} else if (step === 6) {
step = 4
}
return (
<div className={classes.root}>
<Stepper
activeStep={step}
connector={<ColorlibConnector />}
alternativeLabel
>
{steps.map(label => (
<Step key={label}>
<StepLabel
StepIconProps={{
classes: { root: classes.stepIcon },
}}
>
{label}
</StepLabel>
</Step>
))}
</Stepper>
</div>
)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.