【问题标题】:TextInput /Input element looses focus on key pressTextInput /Input 元素失去对按键的关注
【发布时间】:2020-08-11 08:57:37
【问题描述】:

我目前正在使用 React Native 开发应用程序。

这个试用版应用有一个组件,它有一个 TextInput 和两个按钮(添加和删除)。

当我按下添加按钮时,会出现一个新组件。如果我按下删除按钮,相同的组件就会消失。

屏幕如下图所示:

我使用与组件索引相同的索引来控制 TextInput。


我的问题是:为什么我不能像往常一样在这段代码中输入一些文字?

每次输入 1 个单词时,我都必须聚焦光标。

每次我按下一个键时,我都会在输入区域丢失一个闪烁的竖线(我在下面的照片中查看)。

我该如何解决这个问题?

而且,我想用 array[] 而不是 object{} 来控制 TextInput 的输入值,因为如果是数组,则更容易删除组件滑动索引和值,如下面的解释:

我不知道用对象来控制索引和值,现在这对我的技能来说很复杂,但是如果有一些很好的方法来解决使用对象,我希望知道。


代码如下:

import React, { useState } from "react";
import { View, Text, Button, TextInput, StyleSheet } from "react-native";

function Item({ number, handleInput, handleAdd, handleDelete, index }) {
  return (
    <View style={styles.list}>
      <Text>{index}</Text>
      <TextInput
        style={{ borderWidth: 1 }}
        value={number[index]}
        onChange={(e) => {
          handleInput(index, e.nativeEvent.text);
        }}
      ></TextInput>
      <Button
        title="ADD"
        onPress={() => {
          handleAdd();
        }}
      />
      <Button
        title="DELETE"
        onPress={() => {
          handleDelete(index);
        }}
      />
    </View>
  );
}

export default function TestStateArray() {
  const [count, setCount] = useState(1);
  const [number, setNumber] = useState([]);

  function handleAdd() {
    setCount((v) => v + 1);
  }

  function handleDelete(index) {
    setCount((v) => v - 1);
    setNumber((v) => {
      const ret = v.slice();
      ret.splice(index, 1);
      return ret;
    });
  }

  function handleInput(index, text) {
    setNumber((v) => {
      const ret = v.slice();
      ret[index] = text;
      return ret;
    });
  }

  return (
    <View>
      {Array.from({ length: count }, (_, i) => (
        <Item
          number={number}
          handleInput={handleInput}
          handleAdd={handleAdd}
          handleDelete={handleDelete}
          key={i + "-" + number}
          index={i}
        />
      ))}
    </View>
  );
}

const styles = StyleSheet.create({
  list: {
    margin: 10,
    padding: 10,
    backgroundColor: "#ddd",
  },
});

在我得到一些答案和一些评论后,我尝试像下面这样更改代码,但它仍然有同样的问题......

// onChange={(e) => {
//   handleInput(index, e.nativeEvent.text);
      
onChangeText={(text) => {
  handleInput(index, text);
}}

节点:12.18.3

反应原生:4.10.1

世博会:3.22.3

【问题讨论】:

  • 是的,您需要将 onChange 更改为 onChangeText,因为与 React 相比,react-native 的事件侦听器名称略有不同。
  • @devd,我改了onChangeText={(text) =&gt; handleInput(index, text)}这样的代码,但它仍然有同样的问题......
  • 你是说,你每次按任意键都会失去焦点?
  • @devd,没错,我每次按键都会在输入区域丢失一个闪烁的竖线。

标签: reactjs react-native


【解决方案1】:

出现上述问题是因为您的句柄更改功能错误。

请更改...

const [number, setNumber] = useState({}); // change array to Object in useState.

用下面的函数替换你的处理程序:

  function handleInput(index, text) {
    setNumber({ ...number, index: text });
  }

【讨论】:

  • 仅供参考...,您的代码的工作链接codesandbox.io/s/angry-brahmagupta-bm2zg?file=/src/…
  • 感谢您的帮助,我按照您的建议更改了这样的代码function handleInput(index, text) {setNumber((v) =&gt; ({ ...v, [index]: text })); } ,function handleDelete(index) { setCount((v) =&gt; v - 1); setNumber((v) =&gt; {const ret = v.slice(); delete ret[index];return ret; });}
  • 如果我能解决您的问题,请将答案标记为正确并投赞成票-谢谢
  • 在我将代码更改为新代码后,我可以解决问题以输入有用的文本,但如果可能的话,我希望用数组而不是对象来控制值,因为它更容易使用值与组件的索引。
  • ,感谢您在我将代码更改为更新后的帮助,我将文本(数字数组)的值检查为onChangeText={(text) =&gt; { handleInput(index, text); console.log(number); }} 然后虽然我可以看到输入中的值区域,数字数组为空......
【解决方案2】:

React Native 在 TextInput 组件上有 onChangeText 事件,你可以试试吗?

【讨论】:

  • 我尝试使用onChangeText,但随后出现类似TypeError: undefined is not an object (evaluating 'e.nativeEvent.text')的错误
  • 如果我尝试像这样改变` onChangeText={(e) => { handleInput(index, e); }}` TexiInput 也有同样的问题...
  • onChangeText 事件未返回“e”之类的参数。它返回写入 TextInput 组件内的文本参数。在这种情况下,您必须将其更改为 onChangeText={text => handleInput(text)}
  • 我更改了这样的代码onChangeText={(text) =&gt; handleInput(index, text)} 但它有同样的问题...
猜你喜欢
  • 2014-10-12
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多