【问题标题】:React Native - Move to next input after maxlengthReact Native - 在 maxlength 之后移动到下一个输入
【发布时间】:2020-12-29 09:49:22
【问题描述】:

我对 react native 非常陌生,目前我正在构建一个小应用程序以更好地了解这一点,我正在使用 react-native-paper 作为 ui 库。目前我遇到了一个问题,即我有两个输入字段,最大长度为 3。当第一个输入达到其最大长度时,我需要自动移动到下一个输入,即 3。我尝试通过添加 returnKeyType="next" 到输入字段,但它不起作用。

        <View style={styles.textinputViewleft}>
            <NumberInput 
            style={styles.textinput} 
            label="Digit"
            returnKeyType="next"
            value={digit.value}
            onChangeText={(text) => setDigit({ value: text, error: '' })}
            error={!!digit.error}
            errorText={digit.error}
            keyboardType="numeric"
            maxLength={3} />
        </View>
        <View style={styles.textinputView}>
            <NumberInput 
            style={styles.textinput} 
            label="Count"
            value={count.value}
            onChangeText={(text) => setCount({ value: text, error: '' })}
            error={!!count.error}
            errorText={count.error}
            keyboardType="numeric"
            maxLength={3}  />
        </View>

Snack link

【问题讨论】:

    标签: reactjs react-native


    【解决方案1】:

    首先,创建ref 以访问输入。

    const ref = React.useRef();
    

    然后将其传递给第二个TextInput

    <NumberInput 
      ref={ref}
      style={styles.textinput}
      ...
    /> 
    

    当第一个输入的长度达到 3 时,调用focus 将光标插入到第二个输入中。

    onChangeText={(text) => {
      if (text.length === 3) {
        ref.current.focus();
      }
      setDigit({ value: text, error: '' });
    }}
    

    【讨论】:

    • 很好的答案,useRef 就是这么强大的钩子。
    • @LeriGogsadze 因为我正在使用 react-native-paper 库,所以您上面建议的这种方法不起作用。如果我们从 rect-native 默认库中导入 Textinput,它将起作用。但在特定的 ui 库中它不起作用。
    • @soorajspillai 我试过了,它可以工作。你能告诉我你的NumberInput 组件吗?
    • 我已将 numberinput 更改为 textinput 它也是一个自定义组件 snack.expo.io/@ssoorajs96/sjs
    • 是的,这就是它不起作用的原因。你必须使用forwardRef 钩子。 snack.expo.io/HgJK7hzIC 看看。
    【解决方案2】:

    基于@Leri Gogsadze 现有答案的工作示例:

    export default function App() {
      const [numOne, setNumOne] = useState('');
      const [numTwo, setNumTwo] = useState('');
      const ref = useRef();
      return (
        <View style={styles.container}>
          <TextInput
            style={styles.input}
            placeholder="enter number"
            maxLength={3}
            value={numOne}
            onChangeText={(value) => {
              setNumOne(value);
              if (value.length === 3) {
                ref.current.focus();
              }
            }}
            returnKeyType="next"
          />
          <TextInput
            style={styles.input}
            ref={ref}
            placeholder="enter name"
            maxLength={3}
            value={numTwo}
            onChangeText={(value) => setNumTwo(value)}
          />
        </View>
      );
    }
    

    工作示例应用程序:Expo Snack

    【讨论】:

    • 当我使用 react-native-paper 库时,您上面建议的这种方法不起作用。如果我们从 rect-native 默认库中导入 Textinput,它将起作用。但是在特定的 ui 库中它不起作用。
    • 如果可能的话,发布一个具有您提到的问题的虚拟应用程序的展示链接,这将便于我们重现相同的场景和调试。
    • 你可以看看这个零食snack.expo.io/@ssoorajs96/sjs
    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 2021-08-07
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2021-08-27
    • 2023-04-07
    相关资源
    最近更新 更多