【问题标题】:Add new content to object向对象添加新内容
【发布时间】:2021-06-20 07:52:59
【问题描述】:

我在尝试在数组中存储数据时遇到了一些问题。 我创建了一个我多次使用的组件输入。每个输入存储关于用户的不同数据。我想格式化一个对象,其中所有这些信息都将以 json 类型存储。为此,我使用反应 context。但问题是,每次我在我的字段中写入数据时,前一个都会被删除。我知道如何在前一个状态之后在数组中插入,但对于对象,...prevState 不起作用。 此外,如何在 json 中使用我作为道具传递的标签?因为我把label 认为它实际上会获取道具值,但它没有,它只是用label 填充数据。

这是组件

type Label = {
    label: string
    type: string
}

export const Forms = ({ label, type }: Label) => {    
    const {userData, setUserData} = useContext(RegisterContext)

    const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
        e.preventDefault()
     // setUserData(prev => [prev, e.target.value])  this is what I used to do with array
        setUserData({type: e.target.value})
    }

    return (
        <div className="flex flex-col w-64">
            <span className="text-appiness-darkblue">{label}</span>
            <input onChange={handleChange} type={type} className="rounded-md bg-appiness-green focus:outline-none focus:ring focus:border-appiness-darkblue"/>
        </div>
    )
}

这就是我的称呼

<div className="grid grid-cols-2 justify-items-center w-5/12">
    <Forms type="text" label="Username"/>
    <Forms type="string" label="First name"/>
    <Forms type="string" label="Last name"/>
    <Forms type="string" label="Email"/>
    <Forms type="password" label="Password"/>
    <Forms type="date" label="Date of Birth"/>
</div>

【问题讨论】:

  • setUserData(prev =&gt; { ...prev, type: e.target.value })?
  • @raina77ow 我已经尝试过了,我在...prev 上收到了a spread argument must either have a tuple type or be passed to a rest parameter

标签: reactjs typescript use-context


【解决方案1】:

尝试传播状态和type 字段:

 const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
        e.preventDefault()
        setUserData({...userData, type: e.target.value})
    }

【讨论】:

  • 无论如何我可以动态使用我的label 传递的道具作为密钥吗?因为我试过label: e.target.value,它写的是标签而不是密码、用户名等
  • 请解释更多
  • 正如你所看到的,当我调用组件时,我传递了道具,其中之一是标签名称,例如“电子邮件”、“密码”等,当我填充 userData 钩子时,我会喜欢动态地使用这个标签作为 json 的“键”。在您编写的代码中,我想要 type 因为标签 props 的值
  • 你可以试试setUserData({...userData, [label]: e.target.value})
猜你喜欢
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
相关资源
最近更新 更多