如何连接两个 JSX 片段或变量或字符串和组件(在 Reactjs 中)?
How to concatenate two JSX fragment or variables or string and component (in Reactjs)?
我知道 JSX 可能会产生很大的误导性,因为它看起来像字符串,但实际上不是,因此问题中的 "string" 术语,即使我们并不是真正在操作字符串。
下面是一个代码示例(显然是错误的):
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;
}
我有一条线,我想在特定条件下"concatenate"在它前面放一些div。什么是正确的语法?
我试过圆括号、方括号和加号...None 其中似乎有效...
谢谢
使用数组:
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;
}
或使用片段:
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;
}
在这两种情况下,您都必须为 React 提供密钥。如果是数组,您可以直接在元素上设置键。关于碎片,你提供key:element对。
注意:
当从 render
方法 returning 时,您只能 return 单个元素,或者 NULL
. 在这种情况下提供的示例无效.
如果您可以使用父对象,例如另一个 div,您也可以这样做:
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;
}
对于 React Native,我更喜欢这种技术:
- pro: 与数组技术相比,您不必人为地创建键
- con:需要包含元素的开销(例如,View,下面)
jsx = <Text>first</Text>;
jsx = <View>{jsx}<Text>second</Text></View>;
您可以使用空标签,我的意思是,<>
和 </>
,只要您不想要任何额外的 Container-Element
(例如 <View>
),例如下面:
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()}
</>
);
}
}
Note: I tested and it works on react-native
too; see also Fragments.
预览:
可以使用 Array 并将 jsx 代码推送到那里。
例如:
function App() {
function cells() {
const size = 10;
const cells = [];
for (let i=0; i<size; i++) {
cells.push(
<tr>
<td>Hello World</td>
</tr>
)
}
return cells;
}
return (
<table>
<tbody>
{cells()}
</tbody>
</table>
);
}
我知道 JSX 可能会产生很大的误导性,因为它看起来像字符串,但实际上不是,因此问题中的 "string" 术语,即使我们并不是真正在操作字符串。
下面是一个代码示例(显然是错误的):
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;
}
我有一条线,我想在特定条件下"concatenate"在它前面放一些div。什么是正确的语法? 我试过圆括号、方括号和加号...None 其中似乎有效...
谢谢
使用数组:
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;
}
或使用片段:
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;
}
在这两种情况下,您都必须为 React 提供密钥。如果是数组,您可以直接在元素上设置键。关于碎片,你提供key:element对。
注意:
当从 render
方法 returning 时,您只能 return 单个元素,或者 NULL
. 在这种情况下提供的示例无效.
如果您可以使用父对象,例如另一个 div,您也可以这样做:
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;
}
对于 React Native,我更喜欢这种技术:
- pro: 与数组技术相比,您不必人为地创建键
- con:需要包含元素的开销(例如,View,下面)
jsx = <Text>first</Text>;
jsx = <View>{jsx}<Text>second</Text></View>;
您可以使用空标签,我的意思是,<>
和 </>
,只要您不想要任何额外的 Container-Element
(例如 <View>
),例如下面:
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()}
</>
);
}
}
Note: I tested and it works on
react-native
too; see also Fragments.
预览:
可以使用 Array 并将 jsx 代码推送到那里。 例如:
function App() {
function cells() {
const size = 10;
const cells = [];
for (let i=0; i<size; i++) {
cells.push(
<tr>
<td>Hello World</td>
</tr>
)
}
return cells;
}
return (
<table>
<tbody>
{cells()}
</tbody>
</table>
);
}