Событие onChange в поле textInput вызывает проблемы, например, Сочетания клавиш (двойное нажатие на пробел для создания точки (.)), Так как состояние изменяется при каждом нажатии клавиши, и клавиатура не может захватить двойное пространство.
Таким образом, вместо сохранения значения в состоянии, я просто фиксирую его на SubSiteEditing, фиксируя окончательные значения.
<TextInput
onSubmitEditing={this.onSubmit}
value={this.state.text}
placeholder="Say Something.."
blurOnSubmit={false}
editable={true}
/>
Затем мы создаем функцию отправки, которая делает что-то с текстом и очищает поле.
onSubmit = (e) => {
const text = e.nativeEvent.text;
this.setState({text}, () => { // <- Important Callback after setstate
//Whatever U want to do with the data here.
this.setState({text: ''}) // clear the field (this must be in the callback)
})
}
Мы устанавливаем this.state.text в текст, чтобы мы могли установить его обратно в '' после
Перезвоните. Если вы не сделаете этот шаг, состояние не изменится, и
компонент не обновляется с пустым полем.
Я понимаю, что с помощью этого метода все функции клавиатуры будут работать в обычном режиме, включая двойной пробел для точек (.) И даже копирование и вставку значений без использования setState.
Обновление: решение с поддержкой нескольких строк.
Вышеприведенное работает для одной строки, для многострочного, когда мы не используем onSubmitEditing и вместо этого используем кнопку, нам нужно добавить ссылку для ввода текста.
<TextInput
ref={input => { this.textMessage = input }} //Important.
//onSubmitEditing={this.onSubmit} //Remove so we can use newline
value={this.state.text}
placeholder="Say Something.."
blurOnSubmit={false}
editable={true}
multiline={true}
/>
Создать кнопку, которая выполняет отправку
<Button onPress={this.onSubmit}
title="Send"
/>
Есть другой способ получить значение через ссылку для функции onSubmit
onSubmit = () => {
const text = this.textMessage._lastNativeText.trim(); //Remember the ref from textInput?
this.setState({text}, () => {
//Do whatever u want with the text here
this.setState({text: ''}) //clear the field
this.textMessage._lastNativeText = ''; //you need to clear this too
})
Примечание: если вы не установите this.textMessage._lastNativeText пустым, вы
будет продолжать отправлять предыдущее значение, когда вы нажмете кнопку Отправить
Кнопка, хотя textInput выглядит визуально пустым.