【问题标题】:Can't input on other Form Fields无法在其他表单域上输入
【发布时间】:2021-08-21 05:18:26
【问题描述】:

我正在使用反应。我想知道为什么我只能编辑表单的名字部分,而其他输入字段不允许我输入任何内容。

这是我的代码:

import React, {useContext, useState, useEffect} from 'react';
import{GlobalContext} from '../context/GlobalState';
import {Link, useHistory} from 'react-router-dom';

import {Form,FormGroup,Label,Input,Button} from 'reactstrap';

export const EditUser = (props) => {

const {users,editEmployee } = useContext(GlobalContext);
const [selectedUser, setSelectedUser] = useState({
    id:'',
    name:'',
    nameL:'',
    email:'',
    contact:'',
    address:'',
    date:'',
   
});
const history= useHistory();
const currentUserId = props.match.params.id;
useEffect(() =>{
    const userId =(currentUserId);
    const selectedUser =users.find(user=>user.id === userId)
    setSelectedUser(selectedUser)
}, [currentUserId,users])


const onChange = (e) =>{
    setSelectedUser({...selectedUser, [e.target.name]: e.target.value})

}
const onNameL = (e) =>{
    setSelectedUser({...selectedUser, [e.target.nameL]: e.target.value})

}
const onEmail = (e) =>{
    setSelectedUser({...selectedUser, [e.target.email]: e.target.value})

}
const onContact = (e) =>{
    setSelectedUser({...selectedUser, [e.target.contact]: e.target.value})

}
const onAddress = (e) =>{
    setSelectedUser({...selectedUser, [e.target.address]: e.target.value})

}
const onDate = (e) =>{
    setSelectedUser({...selectedUser, [e.target.date]: e.target.value})

}
const onSubmit= () =>{

    editEmployee(selectedUser)
  
    history.push('/');

}


return (
    <React.Fragment>
        <Form onSubmit={onSubmit}>
            <FormGroup>
                <Label>FirstName</Label>
                <Input type="text" name="name" value={selectedUser.name} onChange={onChange} placeholder="enter first name"></Input>
                <Label>Last Name:</Label>
                <Input type="text" name="nameL" value= {selectedUser.nameL}  onChange={onNameL} placeholder="enter your Last name"></Input>
                <Label>Email:</Label>
                <Input type="email" name="email" value= {selectedUser.email}  onChange={onEmail} placeholder="Email Address"></Input>
                <Label>Contact Number:</Label>
                <Input type="number" name="contact" value= {selectedUser.contact}  onChange={onContact} placeholder="Contact"></Input>
                <Label>Address:</Label>
                <Input type="text"name="address" value= {selectedUser.address}  onChange={onAddress} placeholder="enter your Address"></Input>
                <Label>Date</Label>
                <Input type="date" name="date" value= {selectedUser.date}  onChange={onDate} placeholder="enter date employed"></Input>
            </FormGroup>
            <Button type="submit" className="btn btn-info">Edit </Button>
            <Link to="/" className="btn btn-danger">Cancel</Link>
        </Form>
    </React.Fragment>
)
}
export default EditUser;

【问题讨论】:

  • 您认为e.target.nameL 会返回什么?将其更改为 e.target.name 并且您不需要多个更改处理程序。您只需要一个将状态更新为:setSelectedUser({...selectedUser, [e.target.name]: e.target.value })
  • 成功了!谢谢你。但是当我在编辑页面中刷新时,它给了我 TypeError: Cannot read property 'name' of undefined
  • 你能指出导致错误的那一行吗?
  • 我认为这个链接有同样的问题,但仍然找不到解决方法:stackoverflow.com/questions/62118953/…

标签: reactjs use-state


【解决方案1】:

欢迎来到 Stack Overflow 社区!!!

您可以像这样以非常优化的方式使用更少的代码行来做到这一点。它将修复您的错误并使其更易于调试。试试这个。

// necessary imports 

export const EditUser = (props) => {
 const [selectedUser, setSelectedUser] = useState({
    id: "",
    name: "",
    nameL: "",
    email: "",
    contact: "",
    address: "",
    date: "",
  });

  const onChange = (e) => {
    const property = e.target.name;
    const value = e.target.value;

    setSelectedUser({
      ...selectedUser,
      [property]: value,
    });
  }; // Just have only one event for all form elements.

  return (
    <React.Fragment>
      <Form>
        <FormGroup>
          <Label>FirstName</Label>
          <Input
            type="text"
            name="name"
            value={selectedUser.name}
            onChange={onChange}
            placeholder="enter first name"
          ></Input>
          <Label>Last Name:</Label>
          <Input
            type="text"
            name="nameL"
            value={selectedUser.nameL}
            onChange={onChange}
            placeholder="enter your Last name"
          ></Input>
          <Label>Email:</Label>
          <Input
            type="email"
            name="email"
            value={selectedUser.email}
            onChange={onChange}
            placeholder="Email Address"
          ></Input>
          <Label>Contact Number:</Label>
          <Input
            type="number"
            name="contact"
            value={selectedUser.contact}
            onChange={onChange}
            placeholder="Contact"
          ></Input>
          <Label>Address:</Label>
          <Input
            type="text"
            name="address"
            value={selectedUser.address}
            onChange={onChange}
            placeholder="enter your Address"
          ></Input>
          <Label>Date</Label>
          <Input
            type="date"
            name="date"
            value={selectedUser.date}
            onChange={onChange}
            placeholder="enter date employed"
          ></Input>
        </FormGroup>
        <Button type="submit" className="btn btn-info">
          Edit{" "}
        </Button>
      </Form>
    </React.Fragment>
  );
}

如果您需要进一步的支持,请告诉我。

【讨论】:

  • 谢谢,但由于某种原因,当我在页面上并刷新它时,我得到 TypeError: Cannot read property 'name' of undefined
  • 能否提供一个GitHub或codesandbox.io
  • 我无法访问 repo,也无法在代码框上添加文件夹
  • 你按照我的版本更新代码了吗?
  • 是的,但我还是遇到了同样的问题
【解决方案2】:

在所有用于控制表单字段的函数中,使用以下代码:

setSelectedUser({...selectedUser, [e.target.name]: e.target.value})

此外,对于当前的实现,您可以只使用一个函数,即 onChange。使用多个函数是没有用的。

【讨论】:

  • 谢谢。它有效,但由于某种原因,当我在页面上并刷新它时,我得到 TypeError: Cannot read property 'name' of undefined
  • 你能分享你的 GitHub repo 链接吗?
猜你喜欢
  • 2018-11-27
  • 2021-10-28
  • 2019-07-16
  • 2021-12-01
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多