我使用redux将数据存储在应用程序中。我想知道这个方法,如何将数据从状态传递到子组件。我所知道的,在useContext的情况下,我创建了提供者,并可以以简单的方式提取数据,如:
const myData = React.useContext(MyContext);
但我不知道如何以有效的方式在redux中使用相同的技巧。我知道mapeStateToProps,但我希望有更简单的方法。看看我的代码:
import React from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { RootState, store } from 'redux/store';
import { IStep, changeValue } from 'redux/reducers/multiStepForm';
import Stepper from './Stepper';
import Step from './Step';
import Controls from './Controls';
const MultiStepForm = (): JSX.Element => {
const activeStep = useSelector((state: RootState) => state.multiStepForm.activeStep);
const steps = useSelector((state: RootState) => state.multiStepForm.steps);
const dispatch = useDispatch();
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
dispatch(changeValue(e.target.value));
};
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
console.log(
'Form values',
steps.map((step: IStep) => step.value)
);
};
return (
<div style={{ margin: '0 200px' }}>
<h2>MultiStep Form</h2>
<Stepper activeStep={activeStep} steps={steps} />
<form onSubmit={handleSubmit}>
<Step activeStep={activeStep} steps={steps} handleChange={handleChange} />
<Controls activeStep={activeStep} steps={steps} />
</form>
</div>
);
};
export default MultiStepForm;
所以,正如您所看到的,我将道具从状态传递给子对象(Stepper、Step、Controls(。他们每个人都使用相同的道具(activeStep和steps(。
如何让它变得更容易/更智能?
让我们以其中一个孩子为例:
import React from 'react';
import { IStep, InitialMultiStepFormState } from 'redux/reducers/multiStepForm';
import { StepperLine, StepperNumber, StepperStep, StepperWrapper } from './Stepper.styled';
const Stepper = ({ activeStep, steps }: InitialMultiStepFormState): JSX.Element => {
const stepNumber = (step: number) => step + 1;
return (
<StepperWrapper>
{steps.map((step: IStep) => (
<StepperStep key={step.id + 1}>
<StepperNumber completed={step.id <= activeStep}>{stepNumber(step.id)}</StepperNumber>
{stepNumber(step.id) === steps.length ? null : (
<StepperLine completed={stepNumber(step.id) <= activeStep} />
)}
</StepperStep>
))}
</StepperWrapper>
);
};
export default Stepper;
请提供任何建议或链接说明。
如果你必须传递多个(>2-5(级别的东西,你可以在后面的组件中执行相同的useSelector
调用(将它们封装到一个自定义钩子中!(,并且在两者之间不传递任何东西,但对于直接的子级,这就是方法。
即使使用上下文也可能被视为反模式。在解决任何类似上下文的问题之前,您应该已经尝试过props&作文,因为上下文也不是免费的。