Je sais que JSX peut être très trompeur car il ressemble à des chaînes et ce n'est pas le cas, d'où le terme "chaîne" dans la question, même si nous ne manipulons pas vraiment les chaînes.
Voici un exemple de code (faux, évidemment):
let line = <Line key={line.client_id} line={line}/>;
if(line.created_at) {
return <div className="date-line"><strong>{line.created_at}</strong></div> + line;
} else {
return chat_line;
}
J'ai une ligne, et je veux "concaténer" quelques divs devant elle sous certaines conditions. Quelle serait la syntaxe appropriée? J'ai essayé les parenthèses, les parenthèses et le signe plus ... Aucun d'entre eux ne semble fonctionner ...
merci
Utilisez des tableaux:
let lineComponent = <Line key={line.client_id} line={line}/>;
if (line.created_at) {
return [
<div key="date" className="date-line"><strong>{line.created_at}</strong></div>,
lineComponent,
];
} else {
return chat_line;
}
Ou utilisez des fragments:
import createFragment from "react-addons-create-fragment";
let lineComponent = <Line key={line.client_id} line={line}/>;
if (line.created_at) {
return createFragment({
date: <div className="date-line"><strong>{line.created_at}</strong></div>,
lineComponent: lineComponent,
});
} else {
return chat_line;
}
Dans les deux cas, vous devez fournir les clés pour React. En cas de tableau, vous définissez la clé directement sur l'élément. Concernant les fragments, vous fournissez des paires clé: élément.
REMARQUE: lors du retour de la méthode render
, vous ne pouvez renvoyer qu'un seul élément, ou NULL
. Les exemples fournis ne sont pas valides dans ce cas.
Pour React Native, je préfère cette technique:
jsx = <Text>first</Text>;
jsx = <View>{jsx}<Text>second</Text></View>;
Vous pouvez utiliser des balises vides, je veux dire, <>
et </>
, chaque fois que vous ne voulez tout simplement pas Container-Element
(par exemple. <View>
), comme ci-dessous:
render() {
return (
<>
<Text>First</Text>
<Text>Second</Text>
</>
);
}
import React from 'react'
import { View, Text } from 'react-native'
import Reinput from 'reinput'
export default class ReinputWithHeader extends Reinput {
constructor(props) {
super(props);
}
render() {
return (
<>
<View style={{backgroundColor: 'blue', flexDirection: 'row', alignSelf: 'stretch', height: 20}}>
<Text>Blue Header</Text>
</View>
{super.render()}
</>
);
}
}
Remarque: j'ai testé et cela fonctionne sur
react-native
aussi; voir aussi Fragments .
Si vous êtes d'accord avec un objet parent tel qu'un autre div, vous pouvez également le faire de cette façon:
let line = <Line key={line.client_id} line={line}/>;
if(line.created_at) {
return <div><div className="date-line"><strong>{line.created_at}</strong></div>{line}</div>;
} else {
return chat_line;
}