TextInput 中的每次按键后键盘都会关闭本机反应

Posted

技术标签:

【中文标题】TextInput 中的每次按键后键盘都会关闭本机反应【英文标题】:Keyboard closes after every keypress in TextInput react native 【发布时间】:2022-01-19 16:12:12 【问题描述】:

我正在开发一个 react-native 应用程序,在该应用程序中我遇到了 TextInput 问题。

每当我按下键盘上的一个键时,键盘就会关闭。

我尝试过使用不同的文本输入组件,例如材料文本输入和“react-native-elements”输入。但是同样的问题也存在。

stackexchange 上有类似的问题,但他们都试图在 TextInput 中解决这个问题。但是,问题不在于 TextInput,而在于 TextInput 的实现。

我已将代码简化为:

import React, useState from 'react';
import  Text, View, StyleSheet, TextInput  from 'react-native';

const App = () => 
  const [additionalComments, setAdditionalComments] = useState("");

  const StarFeedback = () => 
        return (
            <TextInput
              placeholder="Additional Comments"
              onChangeText=text => setAdditionalComments(text)
              value=additionalComments
            />
        )
  
  

  return (
    <View>
      <StarFeedback/>
    </View>
  );
;

export default App;

const styles = StyleSheet.create(
);

小吃链接:https://snack.expo.dev/@rachitkohli/634602

【问题讨论】:

检查这个***.com/questions/59891992/…> 【参考方案1】:

您不应在每个输入上使用value 属性。使用useRef 并使用onEndEditing 存储值会更好(减少重新渲染)。


import React, useState, useRef, useCallback  from 'react';
import  Text, View, StyleSheet, TextInput,  from 'react-native';

const App = () => 
    const [additionalComments, setAdditionalComments] = useState("");

    const inputEl = useRef(null);


    const handleInputSubmit = useCallback((ev) => 
        const input =  ev.nativeEvent.text;

    // validate all you want here

      setAdditionalComments(input)
    , [setAdditionalComments]);

    const Aux = () => 
        return (
            <View style=marginTop: 100>
                <TextInput
                    ref= inputEl 
                    placeholder="Additional Comments"
                    onEndEditing= handleInputSubmit 
                    defaultValue=additionalComments
                />
            </View>
        )
  
  
...

这样组件只会在用户完成输入时更新。

例如,您可以使用onChange 显示警告标签(或用于预取搜索结果等)。但不值得为每个按键输入设置状态。

【讨论】:

感谢若昂的回答。您的答案有效,但是用户每次输入时都必须提交。这对用户来说是一个额外的步骤。但是,我想使用 onChangeText 让用户在不使用键盘上的提交按钮的情况下继续操作。但是当我使用 onChangeText 时,我面临同样的键盘关闭问题。你能告诉我如何解决吗?谢谢!! 只需将 TextInput 组件上的 onEndEditing 更改为 onChangeText。顾名思义:最后运行一次,每次用户更改输入时运行一次。您可以在我的回答中使用handleInputSubmit 作为起点【参考方案2】:
import React, useState, useCallback from 'react';
import  Text, View, StyleSheet, TextInput  from 'react-native';

  const Aux = () => 
    const [additionalComments, setAdditionalComments] = useState("");

    const handleAdditionalCommentsChanged = (text) => 
      setAdditionalComments(text);
    ;

        return (
          <View >
            <TextInput
              placeholder="Additional Comments"
              onChangeText=handleAdditionalCommentsChanged
              value=additionalComments
            />
          </View>
        )
  
  

const App = () => 

  return (
    <View>
      <Aux/>
    </View>
  );
;

export default App;

Aux 组件在 App 组件内声明,additionalCommentsApp 组件的状态,因此每次传递给它的 prop 发生变化时都会刷新。

【讨论】:

以上是关于TextInput 中的每次按键后键盘都会关闭本机反应的主要内容,如果未能解决你的问题,请参考以下文章

React Native 为啥每次点击 textInput 时我的键盘都会立即消失?

在本机反应中单击 TextInput 字段外部时失去焦点并关闭键盘?

防止在本机反应中按下 TextInput 时显示系统键盘

resignFirstResponder 没有按预期工作。每次按键时键盘都会弹出,而不是仅返回

键盘焦点()在本机反应中不起作用

当Android Textinput autoFocus为true时反应本机键盘不弹出