ES6 React JSX returns 一个对象而不是数组
ES6 React JSX returns an object instead of array
玩过 React 之后,我注意到输出数组时出现了一个奇怪的行为:
function bar1() {
let arr = [0, 1];
return arr.map((el) => foo(el))
}
function bar2() {
let arr = [0, 1];
arr = arr.map((el) => foo(el))
return (
{arr}
)
}
function foo(key) {
return (
<div key={key}>Foo</div>
)
}
我希望 bar1() 和 bar2() 输出相同的结果,但是 bar2() 抛出错误:
Objects are not valid as a React child (found: object with keys {arr}). If you meant to render a collection of children, use an array instead or wrap the object using createFragment(object) from the React add-ons.
我需要在 map 操作后在 bar2() 中插入额外的元素,这就是我不能使用简化版本的原因。
它是与 JSX 相关的错误还是它的行为符合预期?
回答您的问题 - 这不是错误,而是预期的行为。
当你 return {arr}
时,你本质上是 return 一个 {arr: arr}
对象,因为 Babel 将它理解为一个 ES6 对象 shorthand(参见 property definition).为了从两个函数中获得相同的输出,您应该从 bar2()
函数的 return 语句中删除大括号。
玩过 React 之后,我注意到输出数组时出现了一个奇怪的行为:
function bar1() {
let arr = [0, 1];
return arr.map((el) => foo(el))
}
function bar2() {
let arr = [0, 1];
arr = arr.map((el) => foo(el))
return (
{arr}
)
}
function foo(key) {
return (
<div key={key}>Foo</div>
)
}
我希望 bar1() 和 bar2() 输出相同的结果,但是 bar2() 抛出错误:
Objects are not valid as a React child (found: object with keys {arr}). If you meant to render a collection of children, use an array instead or wrap the object using createFragment(object) from the React add-ons.
我需要在 map 操作后在 bar2() 中插入额外的元素,这就是我不能使用简化版本的原因。
它是与 JSX 相关的错误还是它的行为符合预期?
回答您的问题 - 这不是错误,而是预期的行为。
当你 return {arr}
时,你本质上是 return 一个 {arr: arr}
对象,因为 Babel 将它理解为一个 ES6 对象 shorthand(参见 property definition).为了从两个函数中获得相同的输出,您应该从 bar2()
函数的 return 语句中删除大括号。