无法读取未定义的属性(读取“目标”)

Cannot read properties of undefined (reading 'target)

先post这里。我尝试在论坛中搜索,但 none 的答案似乎适用于我的情况。 我是 React 的新手,我的 onChange 处理程序有问题。

在我的 parent 组件中,我有以下内容:

    // User registration - Onchange handler

    const handleChange = (value, event) => {
      // console.log(event.target.value);
      setFormValue({
        ...formValue,
        [event.target.name]: value,
      });
    };

基本上 parent 组件呈现一个多步骤注册表单,它根据状态呈现不同的组件,这里是用户名的条件:

 {step === 1 ? <Username handleChange={handleChange} formValue={formValue} /> : null}

在child中我有以下输入组件:

export const Username = ({formValue, handleChange}) => {
  const username = formValue; 
  
    return (
      <View>
      <Input 
      placeholder="Username..."
      onChangeText={handleChange}
      value={formValue.username}
      name={username} />
      </View>
    )
  }

和输入组件:

const Input = (props, name) => {

  return (
    <Animated.View style={[styles.inputSection, inputAnimated]}>
        <TextInput style={styles.input} placeholder={props.placeholder} placeholderTextColor={theme.colors.lightP} fontSize={16} {...props}/>
    </Animated.View>
  )
}

我不确定为什么会收到错误消息:

无法读取未定义的属性(读取“目标”)

非常感谢任何帮助。 Console.log 共 event.target returns 未定义。

发生这种情况是因为 onChangeText 将输入的值自动传递给分配给它的函数,而不是传递事件本身

如果你想使用事件 => 使用 onChange 而不是 onChangeText

在文档中您 can read for the onChange event

您正在使用 onChangeText

所以 onChangeText 只有文本值,但是如果你想拥有原生事件,你必须使用 onChange。

然后在你的方法中访问它

    const handleChange = ({ nativeEvent: { eventCount, target, text} }) => {
      // console.log(event.target.value);
      setFormValue({
        ...formValue,
        [target]: text,
      });
    };

EDITED

因为再次询问如何访问文本输入的名称。 这里 link 显示 how to handle text input


你也可以这样做: 例如,在您的方法中,您从参数中给出了一个名称,您可以将该名称传递给处理程序参数:
export const Username = ({formValue, handleChange}) => {
  const username = formValue; 
  
    return (
      <View>
      <Input 
      placeholder="Username..."
      onChangeText={(value)=>handleChange(value,username)} {/* here username is the name you are passing to the value */}
      value={formValue.username}
      name={username} />
      </View>
    )
  }

// then in your handle method
   const handleChange = (value,name) => {
      setFormValue({
        ...formValue,
        name: value,
      });
    };