2016-04-22 2 views
2

Я написал обработчик кликов, чтобы разрешить кнопку загрузки на URL-адрес магазина Google Play.Click Handler, вызываемый немедленно в React Native

Проблема в том, что при загрузке страницы URL-адрес сразу же посещается.

Обработчик кликов вложен внутри атрибута onPress, и я ничего не нажимаю, поэтому я стараюсь понять, почему это происходит.

Любая помощь будет оценена!

OpenURL.js:

'use strict'; 
import React, { 
    Component, 
    PropTypes, 
    Linking, 
    StyleSheet, 
    Text, 
    TouchableNativeFeedback, 
    TouchableHighlight, 
    View 
} from 'react-native'; 

class OpenURLButton extends Component { 

    constructor(props) { 
    super(props); 
    } 

    handleClick(url) { 
    console.log(url); 
    console.log('handling click! this is : '); 
    console.dir(this); 
    Linking.canOpenURL(this.props.url).then(supported => { 
     if (supported) { 
     Linking.openURL(this.props.url); 
     } else { 
     console.log('Don\'t know how to open URI: ' + this.props.url); 
     } 
    }); 
    } 

    render() { 
    console.log('logging "this" inside render inside OpenURL.js:'); 
    console.dir(this); 
    return (
     <TouchableHighlight onPress={this.handleClick(this.props.appStoreUrl)}> 
     <Text>Download {this.props.appStoreUrl}</Text> 
     </TouchableHighlight> 
    ); 
    } 

} 


OpenURLButton.propTypes = { 
    url: React.PropTypes.string, 
} 

export default OpenURLButton; 

Inventory.js:

<ScrollView> 
     <View style={styles.ImageContainer}> 
     <Image style={styles.ImageBanner} source={{uri: selectedInventory.bannerImage}} /> 
     </View> 
     <View style={styles.ListGridItemCaption}> 
     <Image style={[styles.ImageThumb, styles.ImageGridThumb]} source={{uri: selectedInventory.thumbImage}} /> 
     <Text style={styles.Text} key="header">{name}</Text> 
     </View> 
     <View> 
     <Text>{selectedInventory.description}</Text> 
     <OpenURLButton url={selectedInventory.appStoreUrl}/> 
     </View> 
    </ScrollView> 

ответ

3

Изменение:

<TouchableHighlight onPress={this.handleClick(this.props.appStoreUrl)}> 
    <Text>Download {this.props.appStoreUrl}</Text> 
</TouchableHighlight> 

To:

<TouchableHighlight onPress={() => {this.handleClick(this.props.appStoreUrl)}}> 
    <Text>Download {this.props.appStoreUrl}</Text> 
</TouchableHighlight> 

С изменением вы создаете анонимную функцию, вызывающую «ваш» метод. Это будет работы.

+0

способ пойти! благодаря!! –

+0

Извините, но я попробовал (и не смог) найти документацию о том, почему использование анонимной функции требуется для предотвращения запуска метода при загрузке страницы. Есть ли где-то аргументы за разницу между поведением 'onPress'/любых обработчиков событий при передаче в методе« local »(живет в том же классе) против« удаленного »(т. Е. This.props.doStuff). У меня проблема, описанная выше, когда я использую локальные методы, и я бы предпочел понять, почему тогда делать что-то «только потому, что». Большое спасибо. –

Смежные вопросы