【问题标题】:React TypeScript 16.8 How to set state from a form inputReact TypeScript 16.8 如何从表单输入设置状态
【发布时间】:2019-07-20 11:57:01
【问题描述】:

当组件加载时,默认状态会显示在姓名和年龄输入中,这很好,但我希望能够在表单字段中输入姓名和年龄,目前我不能,如果可以的话期望 name 和 age 输入中的值更新到状态。同样,当我按下按钮时。最后我觉得应该为状态设置类型定义。

我不明白如何从表单输入中获取值并将它们保存到状态。我不想使用占位符,因为在用户开始键入时会删除该值。我不确定如何为状态设置类型定义。

import React, {useState} from 'react';

const State: React.FC = () => {

  type StateTypes = {
    name: string,
    age: number
  }

  const [state, setState] = useState({
    name: 'Bill',
    age: 23,
  });

  const changeState = () => {
    setState({ 
      ...state, 
      name: 'Jim', 
      age: 25,
    })
  }

  return (
    <div className="home-grid">
      <div>
        <p>Name: {state.name}</p>
        <p>Age: {state.age}</p>
        <hr/>
        <input type="text" value={state.name} onChange={changeState} /><br/>
        <input type="number" value={state.age} onChange={changeState}/><br/>
        <button onClick = {changeState}>Update State</button>
      </div>
    </div>
  );
}

export default State;

【问题讨论】:

    标签: reactjs typescript react-hooks


    【解决方案1】:

    你可以这样做:

    const changeState = (e) => {
        const {value, name} = e.target; 
        setState({ 
          ...state, 
          [name]: value
        })
      }
    

    为此,您的输入需要有一个带有字段名称的 name 属性:&lt;input name="name" ... /&gt;

    【讨论】:

    • 效果很好,我应该为状态设置类型定义吗?
    • 如果你的意思是输入的类型不是状态所必需的,但它需要渲染一个正确的输入元素:developer.mozilla.org/en-US/docs/Web/HTML/Element/…
    • 我用 StateTypes 编辑了上面的内容,因为我使用 typeScript 我觉得我应该在状态上强制执行一些类型,但我不确定
    • 没有太多使用 TypeScript 的经验,但据我所知,您不需要在状态上定义类型。您可能可以在changeState tho 中定义它们。
    【解决方案2】:

    您可以在输入更改时更改状态,或者您可以创建组件的引用并在单击按钮时获取值。 但根据反应文档https://reactjs.org/docs/hooks-reference.html#usestate 更好的是,您可以通过使用多个 useState 尽可能保持状态平坦,因为在钩子中 react 不负责任何突变,如果您仍想保持嵌套状态,则可以使用 useReducer 钩子。

    这里我刚刚做了一些事情,只是让我知道任何需要的更改。

    const State = () => {
      const [name, setName] = useState("");
      const [age, setAge] = useState(0);
    
      const changeName = ({target}) => {
        setName(target.value)
      }
    
      const changeAge = ({target}) => {
        setAge(target.value)
      }
    
      const submitForm = () => console.log({name, age})
    
      return (
        <div className="home-grid">
          <div>
            <p>Name: {name}</p>
            <p>Age: {age}</p>
            <hr/>
            <input type="text" value={name} onChange={changeName} /><br/>
            <input type="number" value={age} onChange={changeAge}/><br/>
            <button onClick = {submitForm}>Update State</button>
          </div>
        </div>
      );
    }
    

    【讨论】:

    • submitForm 函数会调用changeName 和changeAge 吗?关于如何将函数或状态设置为正确类型的任何想法?
    • 否在该示例中,状态将在提交按钮后更新 onChange(即在输入框中输入),然后按您想要对该状态执行的任何操作,例如将数据传递到后端或其他操作。让我知道如果您不想更新状态 onChange 而是只希望在单击时更新,我也会给您这个示例。您在 typeScript 中的意思是正确的类型?
    猜你喜欢
    • 2018-06-16
    • 2017-06-16
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多