react-native TextInput回调函数onSelectionChange和onChange/onChangeText的顺序不一致,

qmb5sa22  于 2个月前  发布在  React
关注(0)|答案(4)|浏览(78)

描述

在大多数情况下,顺序保持不变:
onChange -> onChangeText -> onSelectionChange
以下是我在iOS中发现的一些情况(可能还有更多):

  1. 对于多行文本输入框,第一次按键时触发onSelectionChange事件,但后续的按键触发onChangeText/onChange事件。
  2. 选择并删除一个单词也会删除它左边的一个空格,但在这种情况下,onSelectionChange事件先触发。

重现步骤

Snack
在textInput组件中,使用多行和console.log作为讨论中每个函数的回调函数,查看输出

React Native版本

0.74.84

受影响的平台

运行时 - iOS

npx react-native info的输出

System:
  OS: macOS 14.5
  CPU: (8) x64 Intel(R) Core(TM) i5-1038NG7 CPU @ 2.00GHz
  Memory: 33.76 MB / 16.00 GB
  Shell:
    version: "5.9"
    path: /bin/zsh
Binaries:
  Node:
    version: 21.7.3
    path: ~/.nvm/versions/node/v21.7.3/bin/node
  Yarn: Not Found
  npm:
    version: 10.5.0
    path: ~/.nvm/versions/node/v21.7.3/bin/npm
  Watchman:
    version: 2024.05.06.00
    path: /usr/local/bin/watchman
Managers:
  CocoaPods:
    version: 1.15.2
    path: /usr/local/bin/pod
SDKs:
  iOS SDK:
    Platforms:
      - DriverKit 23.5
      - iOS 17.5
      - macOS 14.5
      - tvOS 17.5
      - visionOS 1.2
      - watchOS 10.5
  Android SDK: Not Found
IDEs:
  Android Studio: 2023.2 AI-232.10300.40.2321.11668458
  Xcode:
    version: 15.4/15F31d
    path: /usr/bin/xcodebuild
Languages:
  Java:
    version: 20.0.1
    path: /usr/bin/javac
  Ruby:
    version: 2.6.10
    path: /usr/bin/ruby
npmPackages:
  "@react-native-community/cli": Not Found
  react:
    installed: 18.2.0
    wanted: 18.2.0
  react-native:
    installed: 0.74.2
    wanted: 0.74.2
  react-native-macos: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: true
  newArchEnabled: false
iOS:
  hermesEnabled: true
  newArchEnabled: false

堆栈跟踪或日志

selection triggered {"end":1,"start":1}
change triggered
change text triggered H
change triggered
change text triggered i
selection triggered {"end":1,"start":1}

重现器

https://snack.expo.dev/zhVuXAjkAi5BMHVKq__vG

截图和视频

  • 无响应*
watbbzwu

watbbzwu1#

你能提供修复这个问题的PR吗?

xiozqbni

xiozqbni2#

cortinico,你能提供修复这个问题的PR吗?
抱歉我选错了标签

dced5bon

dced5bon3#

关于这个问题。
这是iOS的默认行为。
我在系统消息应用上进行了检查,以供参考。
模拟器。屏幕。录制。-。iPhone。15。Pro。-。2024-07-10。at。15.55.35.mp4

发现 :

  • 当我们在键盘上按下退格键并替换字符串为空时,[UITextField代理方法] textView(_:shouldChangeTextIn:replacementText:) 将首先被调用。这将检测到要更改的文本(尚未反映),并从此函数返回 YES
  • 从此函数返回 YES 将进一步调用 textViewDidChangeSelection [UITextField代理方法],并删除一个左侧的空格字符。
    解决方案 :
  • 由于我们现在没有任何回调来移除多余的空格,我们可以接受这个默认行为。
  • 或者,我们可以从 textView(_:shouldChangeTextIn:replacementText:) 方法中保留之前的文本,并在 textViewDidChangeSelection 中检查文本是否发生了变化,然后添加多余的空格。在这里,需要处理许多边缘情况。

对于这个问题:
对于多行文本输入框,对于首次按键时onSelectionChange会先触发,但对于后续按键时onChangeText/onChange会先触发
我已经开始对此进行调试。

h79rfbju

h79rfbju4#

修复此问题:#45377
对于多行文本输入,在onSelectionChange上的第一个按键会先触发,但后续的按键在onChangeText/onChange上会先触发。
已在PR中添加我的发现。

相关问题