react method freecodecamp event binding react-native

binding - method - enlace onPress reactivo-nativo con un argumento



react event (4)

Puede evitar vincular la función en el constructor vinculándola en el valor de onPress y pasando el argumento después de "esto". El patrón de constructor está bien, pero cuanto más entro a OO land, más molesto se siente. Puedes refactorizar tu código como tal,

export default class Nav extends Component { componentDidMount() { this.props.pickNumber(3); } onPress(txt) { console.log(txt); // foo } render() { return ( <View> <Text>####################</Text> <Text>Intro Screen</Text> <Text>Number: {this.props.numbers}</Text> <TouchableHighlight onPress={this.onPress.bind(this,''foo'')}> <Text>Go to Foo</Text> </TouchableHighlight> </View> ); } }

El primer argumento es "esto" y cualquier otro argumento se puede proporcionar después del que se recibirá en el mismo orden.

El comportamiento deseado es pasar un argumento (texto) al controlador onClick a console.log pero parece que estoy haciendo algo mal con la sintaxis.

Si dejo el argumento como sigue, está funcionando bien:

export default class Nav extends Component { componentDidMount() { this.props.pickNumber(3); } onPress() { console.log(''FOOOBAAR''); } render() { return ( <View> <Text>####################</Text> <Text>Intro Screen</Text> <Text>Number: {this.props.numbers}</Text> <TouchableHighlight onPress={this.onPress.bind(this)}> <Text>Go to Foo</Text> </TouchableHighlight> </View> ); } }

Sin embargo, si quiero pasar un argumento al controlador onPress, se queja "No se puede leer la propiedad ''bind'' de indefinido.

export default class Nav extends Component { componentDidMount() { this.props.pickNumber(3); } onPress(txt) { console.log(txt); } render() { return ( <View> <Text>####################</Text> <Text>Intro Screen</Text> <Text>Number: {this.props.numbers}</Text> <TouchableHighlight onPress={this.onPress(''foo'').bind(this)}> <Text>Go to Foo</Text> </TouchableHighlight> </View> ); } }

Gracias

Adición: Si lo cambio a:

onPress={this.onPress.bind(''foo'')}

Tampoco funciona.


Puedes hacer el enlace en el constructor usando ES6:

export default class Nav extends Component { constructor(props) { super(props); this.onPress = this.onPress.bind(this); }

y entonces

onPress(txt) { console.log(txt); } render() { return ( <View> <Text>####################</Text> <Text>Intro Screen</Text> <Text>Number: {this.props.numbers}</Text> <TouchableHighlight onPress={() => this.onPress(''foo'')}> <Text>Go to Foo</Text> </TouchableHighlight> </View> ); } }


Solo debes pasar una función de flecha gruesa antes de llamar a la función.

onPress= {()=> this.handlePress(param)}


También puedes resolverlo con flechas gruesas:

export default class Nav extends Component { handlePress = (text) => { console.log(text); } render() { return ( <View> <Text>####################</Text> <Text>Intro Screen</Text> <Text>Number: {this.props.numbers}</Text> <TouchableHighlight onPress={() => this.handlePress(''weeeeee'')}> <Text>Go to Foo</Text> </TouchableHighlight> </View> ); } }