为什么在React中使用.map()而不是在普通JavaScript中使用时需要spread运算符?
在React应用程序中,我将此对象数组传递给组件:为什么在React中使用.map()而不是在普通JavaScript中使用时需要spread运算符?,javascript,reactjs,Javascript,Reactjs,在React应用程序中,我将此对象数组传递给组件: const flashcards = [ { "back": "bbb1", "front": "fff1", "id": 21 }, { "back": "bbb2", "front"
const flashcards = [
{
"back": "bbb1",
"front": "fff1",
"id": 21
},
{
"back": "bbb2",
"front": "fff2",
"id": 22
},
{
"back": "bbb3",
"front": "fff3",
"id": 20
}
];
在组件中,当我在阵列中映射时,为什么我需要一个排列操作符才能将单个项目从阵列发送到下一个较低的组件(闪存卡),例如:
render() {
return (
<div className="app">
<div>
{this.props.flashcards.map(flashcard =>
<Flashcard {...flashcard} key={flashcard.id} />
)}
</div>
</div>
);
}
因为它是句法上的糖。否则,您必须写出示例中的属性
{this.props.flashcards.map(flashcard =>
<Flashcard back={flashcard.back} front={flashcard.front} key={flashcard.id} />
)}
{this.props.flashcards.map(flashcard=>
)}
因为道具是单向流动的,从父母到孩子。当您有一个作为参考值的道具时,例如数组
或对象
。对其进行任何写入操作都将更改参考
内存中的值,该值将修改来自子组件的道具。因此,销毁
会创建一个新的内存引用,并将其保存,以防被修改
{…flashcard}
-这基本上是在flashcard
组件将接收的道具上的flashcard
对象中传播属性
如果您不想将flashcard
对象的所有属性作为道具传递给flashcard
组件,则不需要这样做
想想这个
<Flashcard {...flashcard} key={flashcard.id} />
作为一种简短的写作方式:
<Flashcard
key={flashcard.id}
back={flashcard.back}
front={flashcard.front}
id={flashcard.id}
/>
flashcards.map(flashcard=>console.log(flashcard.front))代码>与上述操作完全不同。首先,这是一个有趣的错误:.map()
是,所以使用简单的日志不是.map
的目的。这也是问题的症结所在——JS中正确的映射应该是flashcards.map(flashcard=>{…flashcard,[key]=flashcard.id})
,这与第一个示例非常相似。感谢@VLAZ,这一洞察力帮助我理解了这一点。我让您的示例发挥作用,这很有意义,但您必须用括号括住括号,以表明括号用于创建对象,而不是函数括号:const frontFlashcards=flashcards.map(flashcard=>({…flashcard,key:flashcard.id})代码>是的,对不起-我的错在那里。您确实需要()
围绕它。这是一个语法怪癖,否则{}
会被解释为主体,而不是对象文字。好吧,我想我的困惑是我来自Vue.js来做出反应,我只是假设一个人可以像我在Vue.js中习惯的那样传递整个flashcard对象,例如
或@click=“flipFlashcard(flashcard)”
。这在React/JSX中不可能吗?您可以传递整个flashcard
对象-->
<代码>道具
对象现在将有一个名为flashcard
的属性,其值将是这个flashcard
对象。{…flashcard}
和flashcard={flashcard}
之间的区别在于前者将在props
对象上添加flashcard
对象的每个属性,而flashcard={flashcard}
将在props
对象上添加flashcard
属性,但是我的Flashcard.js组件正在接收一个Flashcard对象,例如const Flashcard=(Flashcard)=>(
如果我真的发送了很多参数,为什么不单独接收每个参数,例如const Flashcard=(前面、后面、id)=>(
?@EdwardTanguay如果您将道具作为
传递给Flashcard
组件,那么您必须从道具
对象-->const Flashcard=({front,back,id})=>(
如果将整个flashcard
对象作为
传递,则需要从props
对象-->const flashcard=({flashcard})=>(
.Component不直接接收道具,而是将每个道具作为props
对象的属性传递给组件。
<Flashcard
key={flashcard.id}
back={flashcard.back}
front={flashcard.front}
id={flashcard.id}
/>