问题描述
我有一个关于在 React 类组件中使用常量呈现内容的方式的快速问题。所以下面的代码工作正常(使用 map 函数渲染一个常量):
class App extends React.Component {
array = [
{
name: "Sarah",age: 27
},{
name: "Sam",age: 35
}
]
render() {
const output = this.array.map(elem => (
<div>
<p>{elem.name}</p>
<p>{elem.age}</p>
</div>
));
return (
<div>{output}</div>
);
}
}
但是,以下内容会生成一个空白页面(我只是定义了一个返回 div 的常量并尝试呈现它):
class App extends React.Component {
render() {
const Output = () => (
<div>Hello</div>
);
return (
<div>{Output}</div>
);
}
}
但是如果我使用大括号而不是大括号,则几乎相同的代码可以工作:
class App extends React.Component {
render() {
const Output = () => (
<div>Hello</div>
)
return (
<div>
<Output />
</div>
)
}
}
所以看起来这与大括号和尖括号有关。花括号在我使用 map 函数时起作用,但在我定义一个常量返回 div 并尝试直接渲染它时则不起作用。然后当我使用尖括号时它再次起作用......这有点奇怪。我知道这远不是最重要的事情,我只是想深入了解这一点。提前致谢!
解决方法
class App extends React.Component {
render() {
const Output = () => (
<div>Hello</div>
);
return (
<div>{Output()}</div>
);
}
}
如果您尝试调用函数 Output(),它将返回 JSX 但遵循此 article 他们不建议这样做
,尖括号用于渲染组件。由于您已将 Output
定义为返回一些 JSX 的函数,因此就 React 而言,这使其成为一个函数组件(或者更确切地说是 Babel,它处理您的 JSX 的转译)。
您可以使用大括号,但是您应该将 Output
更改为 React 节点。这样做的方法如下:
class App extends React.Component {
render() {
const Output = <div>Hello</div>
return (
<div>{Output}</div>
);
}
}
检查 THIS 答案以了解 React 节点、元素等之间的区别。