Разница между onEndEditing и onBlur?

React Native имеет компонент TextInput для приема пользовательских входов, и меня интересует разница между

onEndEditing (callback that is called when text input ends)

onBlur (callback that is called when the text input is blurred)

есть ли scenerio, где он не может быть разрешен только с помощью onBlur, когда он полезен для EndEditing?

Ответы

Ответ 1

Привет, сначала позвольте мне сказать, что я ненавижу вас за задание этого вопроса! Вы заставили меня найти ответ:)

Я считаю, что это связано с историей, поскольку оно происходит от iOS, у которого есть собственное событие UIControlEventEditingDidEnd. Вероятно, наименование до blur было введено как абстракция.

TL: DR;

onEndEditing действительно должен быть устаревшим, по моему мнению, но сейчас вы должны использовать его, потому что это самая агностическая версия размытия платформы. См. Ниже.

Оба onBlur и onEndEditing получают событие. На iOS оба эти, похоже, делают то же самое, и у события есть собственный текст. В Android это два разных события, и только один из них имеет доступ к тексту. Для меня это похоже на ошибку.

Обратите внимание на различия между Android onEndEditing и Android onBlur.

// this is undefined on Android
onBlur={(e) => alert(e.nativeEvent.text)}

Итак, если вы читаете текст во время размытия, вы теперь получаете кросс-платформенное использование с onEndEditing.

Смотрите этот rnplay, чтобы увидеть различия в ОС

Ответ 2

Глядя на примеры iOS и Android, кажется, что onEndEditing предназначен для передачи содержимого TextInput, а onBlur не предназначен для передачи каких-либо данных:

Фактически существует разница между тем, когда возникают эти события. Здесь видно, что onEndEditing создан для родного Android onEditorAction, а onBlur - нет. Действие может быть "Поиск" (это соответствует специальному значку "Поиск" на клавиатурах Android), хотя я не знаю, что React Native API позволяет отображать эти значки действий как часть клавиатуры.

В целом, глядя на examples/реализация - хороший способ понять то, что недостаточно хорошо документировано.

Если это неясно в документах JS, отправьте запрос на перенос, чтобы уточнить его. Если реализация делает что-то, что не имеет смысла или несовместимо между платформами, отправьте запрос на перенос, чтобы исправить реализацию. Это должно помочь другим.