Я новичок в React Native, и у меня проблема с использованием onChangeText.
Я пытаюсь использовать TextInput для ввода слова и обновления состояния. Когда я использую onChangeText, я могу вводить только 1 символ за раз, пока он не отобразится повторно. Я могу сохранить ценность, используя
value = {this.state.text}, но поле ввода все равно теряет фокус каждый раз, когда я пишу письмо.
Я также безуспешно пытался использовать onBlur и onSubmitEditing.
Это мой текущий код. Что находится внутри render ().
<View style = {{padding: 10}}>
<TextInput
onChangeText = {(text) => { this.setState({text: text})} }
/>
<TouchableHighlight style = {styles.button} onPress = {this.handlePress.bind(this)}>
<Text style = {styles.buttonText}>Login</Text>
</TouchableHighlight>
<Text style = {{padding: 10, fontSize: 42}}>
{this.state.text}
</Text>
</View>
Таким образом, используя этот метод, я могу писать только одну букву за раз, поскольку this.state.text будет состоять только из одной буквы за раз.
Любая помощь приветствуется.
Решено
Я использовал response-native-tab-view, который использует собственный маршрутизатор. Я написал свой код как это Как видите, рендеринг происходит вне return (). Вот что вызвало мою проблему. Я удалил response-native-tab-view и переписал его как это
Я переделал это в закуску: snake.expo.io/Hk-3w9x3m, и он работает нормально, нет проблем с размытием ввода текста, поэтому проблема определенно в другом месте вашего кода





<TextInput style = {styles.input}
placeholder='username'
onChangeText = {(text) => { this.setState({ username: text})}}>
</TextInput>
Вам нужен {}, чтобы открывать и закрывать функциональный блок, иначе он вернет setState
() => callFn эквивалентен () => {return callFn}, поэтому вы возвращаете свой вызов setState.
Вам нужен здесь () => {callFn}
И удалите {this.state.text} из тега <Text>, который будет запускать повторную визуализацию каждый раз, когда вы меняете state.
Спасибо за ответ. Это была просто опечатка с моей стороны. Я редактировал код. Возникает такая же проблема
Хм, ладно, можешь ли ты посмотреть на пример изображения и, может быть, узнать, что может быть не так?
Можно попробовать извлечь TouchableHighlight для теста?
Но у меня ваша проблема ... это потому, что ваш <Text style = {{padding: 10, fontSize: 42}}> {this.state.text} </Text> это использование вашего состояния является проблемой, удалите это и будет работать
Вы используете this.state.text в своей DOM, поэтому новый DOM не будет равен старому (виртуальному) DOM, поэтому будет выполнен повторный рендеринг.
Я попытался удалить это, просто попробовал еще раз. Возникает та же проблема. Мой код теперь выглядит как <View> <TextInput onChangeText = {(text) => {this.setState ({text: text})}} /> </View>, и проблема все еще возникает
Возможно, вы используете где-то еще this.state.someVariable в DOM ..
Попытайтесь с этим полным компонентом надеяться, что это будет полезно для вас.
'use strict';
import React, { Component } from "react";
import { Text, View, TextInput } from 'react-native';
class Home extends Component {
constructor(props) {
super(props);
this.state = {
text:''
};
}
render() {
let {text}=this.state;
return (
<View style = {{padding: 10}}>
<TextInput onChangeText = {(text) => { this.setState({ text: text})}}/>
<Text style = {{padding: 10, fontSize: 42}}>
{text}
</Text>
</View>
)
}
}
export default Home;
Этот работает. Проблема, вероятно, в том, что мой <View> находится за пределами return ()?
Чего ждать? как внешний возврат?
Я использую response-native-tab-view, думаю, вот как
Хм, не совсем понимаю, но в любом случае не используйте {this.state.variable}, всегда будет запускать повторный рендеринг. Это была ваша проблема здесь.
@oma {this.state.variable} это не проблема, если обновить состояние ur или props, поэтому повторно визуализируйте компонент ur.
Создавать функции внутри свойств компонентов - не лучшая практика. Это всегда будет вызывать повторную визуализацию, даже если ничего не было изменено из-за того, что значение prop является новой функцией. Попробуйте вот так. Я также дал вам способ иметь несколько текстовых входов без создания единой встроенной функции с помощью «каррирования», наряду с превращением их в управляемые входы, при этом их значение «контролируется» состоянием. Социализм в действии!
'use strict';
import React, { Component } from "react";
import { Text, View, TextInput, StyleSheet } from 'react-native';
class Home extends Component {
constructor(props) {
super(props);
this.state = {
name:''
email:''
nameError:''
emailError:''
};
}
onChangeText = name => text => this.setState({ [name]: text });
render() {
let { name, email, nameError, emailError } = this.state;
return (
<View style = {styles.container}>
<TextInput onChangeText = {this._onChangeText("name")} value = {name} />
<Text style = {styles.text}>{nameError}</Text>
<TextInput onChangeText = {this._onChangeText("email"} value = {email} />
<Text style = {styles.text}>{emailError}</Text>
</View>
)
}
}
const styles = StyleSheet.create({
text: {
padding: 10,
fontSize: 42
},
container: {
padding: 10
}
});
export default Home;
Я не хочу быть приверженцем, но вы не должны так связывать, это технически нормально, но это вызовет проблемы с производительностью в более крупных приложениях. Вместо этого привяжите конструктор или объявите методы, которые необходимо привязать как
method = (args) =>, чтобы не связывать все вместе