javascript - 如何从推送对象数组中的组件调用函数?

标签 javascript reactjs react-native

我有一个由 .push() 函数生成的文本组件数组:

handleWordPress = (i) => {
 this.setState({selectedWord: this.props.navigation.state.params.meanings[i]});
};
render() {
 const { params } = this.props.navigation.state;
 var words = [];
 var keys = Object.keys(params.meanings);
 for (var i = 0; i < keys.length; i++) {
  words.push(<Text style={{color: 'grey', padding: 10, fontSize: 20}} key={i} onPress={this.handleWordPress(i)}>{keys[i]} </Text>);
 }
 return (
  <ScrollView style={styles.container}>
    <Text>{words}</Text>
    <Br/>
    <Text style={{fontWeight: 'bold'}}>Tap on a word to see the meaning</Text>
    <Br/>
    <Text style={{fontSize: 40, fontWeight: '800'}}>{this.state.selectedWord}</Text>
  </ScrollView>
 )
}

问题是,如果数组中有 3 个项目,由于 for 语句,它总是呈现为 this.handleWordPress(4) 。我该如何解决这个问题?

最佳答案

只需在 for 循环中使用 let 而不是 var
就像这样:

for (let i = 0; i < keys.length; i++) {
   words.push(<Text style={{color: 'grey', padding: 10, fontSize: 20}} key={i} onPress={this.handleWordPress(i)}>{keys[i]} </Text>);
}

这里有一个例子来看看 varlet 之间的区别:

var p$ = document.getElementById("p$");
var array = ["I", " am", " a", " boy"];


// Won't work whit var in first paragraph
// Takes only final i which will be the length of array
for (var i = 0; i < array.length; i++) {
  var time = i * 500;
  setTimeout(() => p1.textContent += array[i], time);
}

// Will work whit let in second paragraph perfectly
for (let i = 0; i < array.length; i++) {
  var time = i * 500;
  setTimeout(() => p2.textContent += array[i], time);
}
<p id="p1" style="background: beige;">with var:  </p>
<p id="p2" style="background: #fee;">with let:  </p>


编辑:(评论评论)
它之所以有效,是因为:

使用 var 声明的变量不是 for 循环 block 的本地变量,而是封闭函数作用域或全局作用域的本地变量。所以它在循环的每次迭代中都会更新。当计时器开始读取我的示例中的变量i时,它会发现i == array.length

let 的工作方式有所不同。它对于封闭 block 来说是本地的(在我们的例子中是 for 循环 block )。 在每次迭代中,我们都会有一个新的 i 实例,并且所有实例都有不同的值。

在此处了解更多信息:let - JavaScript | MDN

关于javascript - 如何从推送对象数组中的组件调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48876739/

相关文章:

javascript - 文本区域不会根据预填充值自动调整大小

javascript - 隐藏上一个 div 并在单击按钮时切换下一个 div?

javascript - 如何在 JavaScript 中编写 import 语句而不是 require 语句?

javascript - Firebase - 为离线情况设置与更新?

react-native - 上传至 EAS 版本 : Error: Request failed: 403 (Forbidden)

javascript - 将图像设置为相对于屏幕尺寸的尺寸?

javascript - 实现类似 Vim 的热键时遇到问题

javascript - 通过在 Google map HTML 中点击获取特定点的纬度和经度

clojure - 试剂未注册原子表

javascript - 有没有办法在 react 传单的标记上添加徽章?