2017-02-15 14 views
1

Это мой код:неопределенный не является объект (оценка «this.state.starSide»)

class StarListScrollViewCell extends Component{ 
static propTypes = { 
    dateSource : React.PropTypes.array 
} 
constructor(props){ 
    super(props); 
    this.state = { 
     starSide : 20, 
    } 
} 
addStar(){ 
    LayoutAnimation.spring(); 
    this.setState({starSide: this.state.starSide + 10}); 
} 
componentWillMount() { 
    LayoutAnimation.spring(); 
} 
render(){ 
    return(
     <View style={{backgroundColor: 'white' , height: 70 , width : Dimensions.get('window').width,flexDirection:'row'}}> 
      <TouchableOpacity style={{backgroundColor: 'red' ,width:Dimensions.get('window').width/7,justifyContent:'center',alignItems:'center'}} 
      onPress = {this.addStar()}> 
       <Image source={require('./star-gray.png')} 
         style ={{width:this.state.starSide, 
          height:this.state.starSide, 
          justifyContent:'center',alignItems:'center'}}> 

       </Image> 
      </TouchableOpacity> 
     </View> 
    ); 
} 

}

Я обнаружил ошибку, когда я нажимаю button.And я пишу это ссылки https://facebook.github.io/react-native/releases/next/docs/animations.html

+0

Как @ owaishanif786 упомянул вам необходимо связать метод к текущему компоненту, но также когда вы вызываете его: 'onPress = {this.addStar}' без круглых скобок – Hosar

+0

Возможный дубликат [this.state не определен во время события onPress в реакции native] (https://stackoverflow.com/questions/37123387/this-state-is-undefined-during-onpress-event-in-react-native) – kas

ответ

1

Вы должны привязать это к addStar, поскольку этот контекст изменяется при вызове из обработчика события.

constructor(props){ 
    super(props); 
    this.state = { 
     starSide : 20, 
    } 

    this.addStar = this.addStar.bind(this); 


} 

<TouchableOpacity onPress = {this.addStar()}> 

Также выше линии будет работать нормально, но она будет называться сразу может быть, которая не является вашей целью, так вместо того, чтобы использовать

<TouchableOpacity onPress = {this.addStar}> 
+0

Спасибо за помощь !!!! – RichardSleet

0

Вы должны связать контекст обработчику при его использовании в JSX и когда вы установите onPress пропеллер не вызывать метод, просто передать ссылку на него:.

<TouchableOpacity style={{backgroundColor: 'red' ,width:Dimensions.get('window').width/7,justifyContent:'center',alignItems:'center'}} 
      onPress = {this.addStar.bind(this)}> 
+1

Спасибо за вашу помощь – RichardSleet

0

Реагировать обработчики не будут автоматически связаны с элементом/класса они находятся в

Изменение onPress = {this.addStar()}> в

onPress = {this.addStar.bind(this)}> 
+0

Спасибо за помощь – RichardSleet

0

Вместо связывания вы можете просто использовать стрелки функции:

addStar =() => { 
    LayoutAnimation.spring(); 
    this.setState({starSide: this.state.starSide + 10}); 
} 

И потом:

<TouchableOpacity onPress={this.addStar}>