J'utilise React Native 0.57.8 et React 16.7.0 . Je crée un clavier à l'écran pour Android TV qui sera utilisé comme bibliothèque. J'ai un TextInput auquel j'ai attribué une référence. Comment puis-je utiliser cette référence pour changer la valeur de TextInput?
<Button
text="change value"
onPress={() => {
this.props.emailRef.current.props.value =
this.props.emailRef.current.props.value + "q";
}}
/>
Dans la bibliothèque:
constructor(props) {
super(props);
this.emailRef = React.createRef();
}
<TextInput
ref={this.emailRef}
placeHolder="Email Address"
blurOnSubmit={false}
/>
<Keyboard textInput={this.emailRef} />
3 Réponses :
Je pense que vous avez besoin d'une entrée contrôlée. Voici comment je procéderais:
constructor(props) {
super(props);
this.emailRef = React.createRef(); // might not need this
this.state = {
value: ''
}
}
<TextInput
value={this.state.value}
onChangeText={(text) => this.setState({text})}
placeHolder="Email Address"
blurOnSubmit={false}
/>
<Button
text="change value"
onPress={() => {
// just use `this.state.value` to do whatever you need with it
}}
/>
Vous ne pouvez pas modifier un accessoire directement dans le composant - Les accessoires ne peuvent être dérivés que d'un composant parent, mais ne peuvent pas être modifiés, vous ne pouvez donc pas faire:
this.props.emailRef.current .props.value = this.props.emailRef.current.props.value + "q";
De plus, vous faites référence à this.props.emailRef dans votre bibliothèque, alors que le clavier n'a pas le prop emailRef - il a le prop textInput .
Essayez ceci:
<Button
text="change value"
onClick={() => {
this.props.onInput(this.props.textInput.current.props.value + "q");
}}
/>
À l'intérieur de la bibliothèque:
constructor(props) {
super(props);
this.emailRef = React.createRef();
this.state = {
value: "Initial Input"
};
this.handleInput = this.handleInput.bind(this);
}
handleInput(input) {
this.setState({ value: input });
}
render() {
return (
...
<Keyboard textInput={this.emailRef} onInput={this.handleInput} />
<TextInput ref={this.emailRef} value={this.state.value} />
...
);
}
'value' est une propriété en lecture seule. Utilisez la fonction setNativeProps
Définir le texte dans la méthode d'état puis mettre à jour l'état dans le bouton enfoncé
puis définir le texte comme celui-ci
<Text>
{this.state.myText}
</Text>
Y a-t-il une raison pour laquelle vous n'utilisez pas state pour les valeurs? Par exemple:
value = {this.state.value}dans votre TextInput@JRK Oui, je crée un clavier à l'écran pour Android TV qui sera utilisé comme bibliothèque.
Alors pourquoi ne pouvez-vous pas utiliser l'état?
TextInput et Button sont-ils dans le même composant?
@markmoxx Le clavier dans son ensemble est importé en tant que composant. La valeur sera mise à jour dans le
onPressde chacun des boutons de la bibliothèque. L'état de l'écran ne peut pas être mis à jour à partir de là.@markmoxx Non, ils ne font pas partie du même composant.
Votre TextInput est-il vraiment une entrée de texte, c'est-à-dire pouvez-vous y taper directement, ou est-il simplement contrôlé par les boutons? En d'autres termes, a-t-il vraiment besoin d'être un TextInput?
@markmoxx C'est un RN TextInput. Il est sur Android TV, il est donc flou et non modifiable, c'est pourquoi un clavier à l'écran est nécessaire pour changer sa valeur.
@khateeb vérifier ma réponse mise à jour