J'ai une page où je rend 8 composants, la seule chose différente est une itération des valeurs ...
<Item
classModifier="step"
image={Step1}
heading={Copy.one.heading}
/>
<Item
classModifier="step"
image={Step2}
heading={Copy.two.heading}
/>
<Item
classModifier="step"
image={Step3}
heading={Copy.three.heading}
/>
Ce qui précède fonctionne, mais y a-t-il une manière plus efficace d'écrire ceci ? Je sais que cela n'adhère probablement pas à la méthodologie DRY!
4 Réponses :
string Step1, Step2, ... variables convenient -
Composants basés sur la chaîne courante et son index dans le tableau précédemment décrit Vous aurez quelque chose qui ressemble à ceci
const numbers = ['one', 'two', 'three'];
const steps = [Step1, Step2, Step3]; // These need to be defined before
return (
<div>
{numbers.map((s, i) => (
<Item key={i} classModifier='step' image={steps[i]} heading={Copy[s].heading}>
))}
</div>
);
Vous devriez probablement combiner les deux tableaux en un seul. Avoir deux tableaux qui sont requis pour correspondre à leur ordre n’est pas un bon modèle.
Oui, c'est la bonne façon de le faire même si cela fonctionne. J'ai inclus un lien vers votre réponse au lieu de modifier la mienne car alors ce sera exactement comme le vôtre (auquel vous avez pensé en premier)
Vous pouvez créer un tableau et le mapper dessus en renvoyant les composants
render(){
const Items = [
{step:Step1, heading: Copy.one.heading},
{step:Step2, heading: Copy.two.heading},
{step:Step3, heading: Copy.three.heading}
]
return Items.map(({step, heading},index)=><Item
key={index}
classModifier="step"
image={step}
heading={heading}
/>)
}
L'index utilisé pour l'accessoire key est généralement un anti-pattern bien que dans ce cas où le tableau est construit manuellement, il ne devrait pas poser de problème.
De plus, je ne sais pas plus d'où viennent Step1 et Copy et leur format, donc j'ai juste construit manuellement le tableau. Peut-être que le format que vous avez vous permet de mapper directement sur une liste et d'avoir accès à ces informations.
Sans savoir exactement comment les données sont structurées ou si vous pouvez modifier la structure, un modèle courant consiste à utiliser map ().
render(){
const data = [
{
image: "a.jpg",
heading: "A",
key: 0
},
{
image: "b.jpg",
heading: "B",
key: 1
}
];
const someComponents = data.map(d => (
<Item key={d.key} classModifier="step" image={d.image} />
));
return (
<div>{someComponents}</div>
)
}
séparez les données et les vues. et rendre la vue en itérant les données.
data = [
{ image: Step1, heading: Copy.one.heading },
{ image: Step2, heading: Copy.two.heading },
{ image: Step3, heading: Copy.three.heading },
]
data.map((obj, index) => {
return <Item
key={index}
classModifier="step"
image={obj.index}
heading={obj.heading}
/>
})