试图学习React和Javascript,但坚持使用这种奇怪的map语法,并向其传递匿名函数



这来自React教程本身。我是一名从事web开发的C#开发人员,有些Javascript语法让我感到困惑

历史本身就是一个9大小的数组。

几个问题:

  1. 什么是步骤,为什么没有在任何地方使用或引用它?这就是这个函数的范围,我真的不确定这些参数是怎么回事
  2. map究竟对那个匿名函数做了什么
  3. 什么是动作?它是一个数组吗?这种列表项的返回究竟有什么作用
const moves = history.map((step, move) => {
const desc = move ?
'Go to move #' + move :
'Go to game start';
return (
<li>
<button onClick={() => this.jumpTo(move)}>{desc}</button>
</li>
);
});

让我们一步一步来看看这个。

const moves = history.map()

我们在这里知道什么?我们知道,我们正在定义一个名为moves的常量,以保存一个名称为history的数组的迭代返回值。我们如何知道history是一个数组?因为.map是JS原型函数/for (let i = 0; i < history.length; i +=1) ...的简写

进一步,我们创建了一个匿名函数,就在所谓的.map()函数内部,如下所示:

const moves = history.map((step, move) => ...

什么是step,什么是move?这通常被命名为valueindex。命名并不重要,这是一个函数参数的名称,我们可以调用它,但它对我们来说很清楚

让我们这样写:

const moves = history.map((value, index) => ...也许现在更有意义了?value是井,数组项的值,索引是它的位置。

.map()是一个缩写原型,用于为我们提供对值及其映射索引的快速迭代。

比方说history = ['/login', '/logout', '/home]

history.map((value, index) => console.log(value, index))会给我们'/login', 0/logout, 1/home 2

我们也可以完全省略step / index参数,它是可选的(value参数也是可选的,但您最想使用它。(

现在它是什么return?它使用从数组生成的值返回HTML/JSX(在React的情况下(元素。

我们也可以这样写(也许更类似于普通的VanillaJS会引发一些C#相似之处(:

const moves = []
for (let i = 0; i < history.length; i += 1) {
const step = history[i]
const move = i
const desc = move ? `Go to move #${move}` : 'Go to game start'
moves.push(
<li>
<button onClick={() => this.jumpTo(move)}>{desc}</button>
</li>
)
}
return <ol>{moves}</ol>

结果:

<ol>
<li>
<button onClick={() => this.jumpTo(0)}>Go to move #0</button>
</li>
<li>
<button onClick={() => this.jumpTo(1)}>Go to move #1</button>
</li>
<li>
<button onClick={() => this.jumpTo(2)}>Go to move #2</button>
</li>
</ol>

Map函数在参数中获取元素及其索引,所以如果只想获取索引,则需要以某种方式命名第一个参数(元素(,惯例是使用_作为未使用变量的名称。所以step是历史数组中的元素,移动是它的索引

Map调用该函数时,该数组的每个元素都将元素作为第一个参数,将索引作为第二个参数,返回值用于返回的数组。

示例:

const a = [1,2,3];
const b = a.map(element => element*2); // b = [2,4,6]

.map是一个帮助函数,用于在旧数组的基础上创建新数组。您传入一个函数,该函数描述如何进行转换。然后,函数将被多次调用,对于数组的每个元素调用一次,返回值用于构造新数组。

函数将在3个参数中传递:数组的一个元素、该元素的索引和整个数组。在您提供的代码片段中,第一个参数被命名为step,第二个参数为move,第三个参数被忽略。

考虑到这一描述,以下是您个人问题的答案:

什么是步骤

数组中的值。因此,第一次调用函数时,它是history[0]处的值。下一次是history[1]

为什么它没有在的任何地方使用或引用

代码的作者并不需要它。他们仍然需要给它一个名字,但这只是为了让他们可以给第二个参数一个名字——他们真正关心的那个。

map对那个匿名函数到底做了什么?

它将为history的每个元素调用一次函数,并使用返回值创建moves

什么是移动?它是一个数组吗?

是的,它是一个对象数组。这些对象向React描述页面应该是什么样子。

最新更新