将值传递给数组

时间:2017-12-05 04:13:02

标签: javascript arrays reactjs react-native state

我从JSON数组中提取数据并从中创建对象,并使用for循环在我创建的对象中设置数组所需的字符串值:

var gamesList = [];
gamesList = this.props.navigation.state.params.gamesList;
var gameIconList = [];

for(var i=0;i<3;i++){
  var provider = gamesList[i].provider;
  var gameId = gamesList[i].gameId.toString();

  gameIconList.push(
    <TouchableOpacity onPress={(provider,gameId) => this.launchGame(provider,gameId)}>
      <ResponsiveImage source={{uri: gamesList[i].imageUrl}}
      initWidth="200" initHeight="120" defaultSource={require('./splash-tile2.png')} />
    </TouchableOpacity>
  );
}

这一切都发生在render()函数中,{gameIconList}将在return()函数中调用,如下所示:

return(
 <ScrollView horizontal={true}>
    {gameIconList}
 </ScrollView>
);

正如您所看到的,我通过循环将字符串值设置为onPress函数调用,当我单击TouchableOpacity中的图像时,我希望将我设置的字符串值发送回上面的函数这是:

  launchGame = (provider, gameId) => {

  params = {
    Provider: provider.nativeEvent.text,
    Platform: this.state.Platform,
    Environment: this.state.Environment,
    GameId: gameId,
    IsDemo: this.state.IsDemo
  };

  request = {
    method: 'POST',
    headers:{
      "Content-Type": "application/json"
    },
    body: params
  };

}

但问题是我尝试了很多不同的方法,当涉及到提供者值时,我总是最终得到一个代理对象,并且当涉及到gameId值时,发送给我的是未定义的。

我尝试了event.target.valueevent.nativeEvent.text的调用方法,但无济于事。

我错过了什么? 如果这不是向函数发送值的正确方法,我是否可以获得如何正确执行此操作的指南?

1 个答案:

答案 0 :(得分:4)

onPress的{​​{1}}道具采用了一个回调函数,该函数在按下&#34;&#34;时被调用。

此函数应该是一个事件处理程序。通常使用TouchableOpacity对象调用事件处理程序。我认为你误解了如何调用回调函数。请浏览this

因此,在第一个参数中使用事件对象(React中的代理事件对象)调用函数,并将event作为第二个参数调用。

请改为:

undefined

但还有更多。由于闭包的工作原理,这可能无法正常工作。请参阅here

基本上,您要在每个循环中更改<TouchableOpacity onPress={() => this.launchGame(provider, gameId)}> provider中的值。回调函数在其闭包中有这些变量,但它们不存储定义这些函数时的确切值(基本上,您将获得存储在gameId和{{1}中的最后一个值当按下所有provide时。这也是因为您使用的是gameId,而不是TouchableOpacityvar,它们具有功能范围而非阻止范围。

您可以这样做:

let

这样您就可以直接在每个回调范围中定义这些变量。 (或者,如果您可以使用const<TouchableOpacity onPress={() => { var provider = gamesList[i].provider; var gameId = gamesList[i].gameId.toString(); this.launchGame(provider, gameId) }}> <ResponsiveImage source={{uri: gamesList[i].imageUrl}} initWidth="200" initHeight="120" defaultSource={require('./splash-tile2.png')} /> </TouchableOpacity> ,请在定义letconst时将var更改为const,您的代码应该有效。 )