微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

React-TypeScript:TypeError:无法读取未定义的属性“ id”

如何解决React-TypeScript:TypeError:无法读取未定义的属性“ id”

我正在使用React-typescript。我有一个登录页面,其中有两个输入字段。一种是电子邮件和密码。我已经创建了一个州,并且在该州内创建了email passwordloading认输入字段工作正常,我用id定位了输入字段。我已经决定,我将创建全局输入字段和自定义道具。当我使用全局输入字段时,它不会以id为目标,并向我抛出此错误React-typescript: TypeError: Cannot read property 'id' of undefined。我很确定在我的打字稿onChange中会抛出该错误。但是不知道如何解决它。这是我在Codesandbox中的代码

这是我的登录表单

import React,{ ReactElement,useState } from "react";

import { TextInput } from "./input";

interface Props extends PageProps {}

export default function SignIn({}: Props): ReactElement {
  const [state,setState] = useState({
    email: ``,password: ``,loading: false
  });
  const { loading,email,password } = state;
  const handleSignIn = (e: React.ChangeEvent<HTMLInputElement>) => {
    setState({
      ...state,[e.target.id]: e.target.value //This is id which throws me error
    });
  };
  const onSubmit = async (e) => {
    e.preventDefault();
    console.log(state);
    setState({
      loading: true,...state
    });
    const response = await fetch(
      "https://run.mocky.io/v3/beec46b8-8536-4cb1-9304-48e96d341461",{
        method: `POST`,headers: {
          Accept: `application/json`,"Content-Type": `application/json`
        },body: { state }
      }
    );
    console.log(response);

    if (response.ok) {
      setState({ ...state,loading: false });
      alert(`login succs`);
    } else {
      alert(`login Failed`);
    }
  };
  return (
    <div>
      <TextInput
        type="text"
        value={email}
        onChange={handleSignIn}
        id="email"
        required
      />
      <TextInput
        type="password"
        value={password}
        onChange={handleSignIn}
        id="password"
        required
      />
      <button type="submit" name="action" onClick={onSubmit} disabled={loading}>
        {" "}
        {loading ? `loading...` : `save`}
      </button>
    </div>
  );
}

这是我的全局输入

import React,{ ReactElement } from "react";
import styled from "styled-components";

interface Props {
  value: string;
  onChange: (e: string) => void;
  error?: string;
  id?: string;
}

const Input = styled.input``;

// eslint-disable-next-line func-style
export function TextInput({ value,onChange,error,id }: Props): ReactElement {
  return (
    <div>
      <Input
        value={value}
        onChange={(e) => onChange(e.target.value)}
        error={error}
        id={id}
      />
    </div>
  );
}

解决方法

我找到了解决方案:我创建了两个句柄更改功能,一个用于电子邮件,一个用于密码。

`const handleEmail = (email: string) => {
    setState({
      ...state,email
    });
  };
  const handlePassword = (password: string) => {
    setState({
      ...state,password
    });
  };`

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。