尝试使用 Typescript 在简单的 React 表单组件中使用 handleChange。难以访问 e.target.value

Posted

技术标签:

【中文标题】尝试使用 Typescript 在简单的 React 表单组件中使用 handleChange。难以访问 e.target.value【英文标题】:Trying to use a handleChange in a simple React form component using Typescript. Struggling with accessing e.target.value 【发布时间】:2021-11-09 18:55:42 【问题描述】:

我是 Typescript 的初学者,但我喜欢认为我知道在 React 方面我在做什么。这个编码挑战需要我构建一个简单的多页注册表单。

我的做法是跟踪 App 状态的进度,并根据进度有条件地显示五个“表单阶段”组件之一。首先它会询问您的姓名,然后是电话,然后是电子邮件。这不是我喜欢我的表格的方式,但这是必需的。

目前我正在努力让一个简单的 changeHandler 工作。这是我的组件的 Props 界面,当用户进度 === 0 时应该会出现。

interface Props 
    firstName: string;
    lastName: string;
    handleChange: (e: React.ChangeEvent<htmlInputElement> | undefined) => void;

这就是我观察输入字段的方式

    const [first, setFirst] = useState<string>("");
    const [last, setLast] = useState<string>("");
    const inputRef = useRef<HTMLInputElement>(null);

最后,这是一个示例字段:

      <input
                ref=inputRef
                id="firstName"
                type="text"
                value=last
                onChange=handleChange   // Some function logic here
            ></input>

通常,我会构造一个像这样的输入字段(例如):

<textarea
                className="post-draft"
                name="post"
                onChange=(e) => 
                    handleChange(e);
                
                rows=2
            />

然后我将拥有一个使用 if(e.target.name === "post") 等的 handleChange 函数来执行不同的状态更改。

如何在 TS 中复制这种行为? 在 App.tsx 中,我需要在大括号内放入什么内容才能正确编译?

<FullName firstName="" lastName="" />

handleChange 显然也需要进入这里。我完全不知道如何以及为什么。

【问题讨论】:

【参考方案1】:

我不知道我是否做对了,但是您需要有关 InputBox 的 HandleChange 的帮助,并且您想在单击按钮后获取 InputBoxes 中的所有值?就像您正在检查表单是否正确,然后就转到下一页?

如果是这种情况,您可以在更改时使用 useEffect

完整的应用代码示例:

import  useState  from "react";

function App() 

  const inputStyle = float:"left",clear:"left",marginTop:"20px",height:"30px",width:"200px",fontSize:"18px",textAlign:"center";
  const buttonStyle = float:"left",clear:"left",marginTop:"20px",height:"30px",width:"200px",fontSize:"18px",textAlign:"center",backgroundColor:"#005dc7",borderRadius:"5px",color:"white",border:"0px",cursor:"pointer";
  const containerStyle = display:"block",alignItems:"center",width:"400px",margin:"0 auto";
  const [email,setEmail] = useState("");
  const [name,setName] = useState("");
  const [surname,setSurname] = useState("");

  const onNext = (event) =>
  
      event.preventDefault(); //Prevent the normal "Form" handle
      if(email && name && surname) //if everything is set (not null and not empty)
      
        console.log("email : "+email);
        console.log("name : "+name);
        console.log("surname : "+surname);
        console.log("ALL DONE! GO NEXT PAGE!");
      
      else
      
        console.log("SOMETHING IS LEFT EMPTY!");
      
  

  return (
    <>
    <div style=containerStyle>
      <h1>Register Form</h1>
      <form>
        <input style=inputStyle  type="text" placeholder="Your Email" onChange=(event) => setEmail(event.target.value)/>
        <input style=inputStyle type="text" placeholder="Your Name" onChange=(event) => setName(event.target.value)/>
        <input style=inputStyle type="text" placeholder="Your Surname" onChange=(event) => setSurname(event.target.value)/>
        <input style=buttonStyle type="button" value="Next" onClick=event => onNext(event)></input>
      </form>
    </div>
    </>

  );





export default App;

希望它是正确的,它会有所帮助!

【讨论】:

以上是关于尝试使用 Typescript 在简单的 React 表单组件中使用 handleChange。难以访问 e.target.value的主要内容,如果未能解决你的问题,请参考以下文章

制作一个高阶组件以与 TypeScript 互操作 react-relay 和 react-router

typescript tslint react setup中的“'public'只能在.ts文件中使用”?

如何像在 babelrc 中创建依赖别名一样在 typescript 中创建类型别名?

尝试自己搭一个简单的typescript运行环境

当父组件在其子组件中注入道具时,如何在 Typescript 中定义道具?

MapDispatchToProps 导致父组件中的 Typescript 错误,期望 Actions 作为 props 传递