reactjs Axios PUT请求未正确更新状态

smtd7mpg  于 2023-03-12  发布在  React
关注(0)|答案(1)|浏览(152)

EditContact中,用户更新他们当前的联系人,EditContact表单的提交按钮发送一个axios请求来更新联系人并更改状态。当它改变状态时,它不会导致重新呈现,我必须刷新页面才能看到变化。我对put请求的响应也发送回更新的数据,但我的setContacts可能有问题。我尝试过不使用回调函数来设置状态,而是使用map函数的返回数组来设置状态。另外,我在editContactHandler中将setContacts设置为空数组,这确实会导致重新呈现。
App.js

function App() {
  const [contacts, setContacts] = useState([]);

  const editContactHandler = async (contact) => {
    try {
      const response = await axios.put(
        `http://localhost:3006/contacts/${contact.id}`,
        contact
      );
      setContacts((prevContacts) =>
        prevContacts.map((prevContact) => {
          return prevContact.id === contact.id ? response.data : prevContact;
        })
      );
    } catch (error) {
      console.log(error);
    }
  };

EditContact.js

const EditContact = (props) => {
  const params = useParams();
  const navigate = useNavigate();
  const [formData, setFormData] = useState({
    id: params.id,
    firstName: '',
    lastName: '',
    email: '',
  });

  const handleChange = (event) => {
    const { name, value } = event.target;
    setFormData((prevFormData) => ({ ...prevFormData, [name]: value }));
  };

  const handleUpdate = (e) => {
    e.preventDefault();
    if (formData.firstName === '' || formData.email === '') {
      alert('All fields are mandatory');
      return;
    }
    props.editContactHandler(formData);
    setFormData({ id: params.id, firstName: '', lastName: '', email: '' });
    navigate('/');
  };
czq61nw1

czq61nw11#

也许下面的解决方案可以帮助您:
你应该有编辑按钮,每当用户点击该编辑按钮,下面的代码应该运行:

const editContactHandler =(contact) => {
      setContacts((prevContacts) =>
        prevContacts.map((prevContact) => {
          return prevContact.id === contact.id ? response.data : prevContact;
        })
    }
  };

此外,如果用户更改任何数据并点击保存/提交按钮,则应发生以下情况:

const submitEditContact = async (id) => {
    try {
      const response = await axios.put(
        `http://localhost:3006/contacts/${id}`,
        contact
      );
     
    } catch (error) {
      console.log(error);
    }
  };

您应该考虑将更改和保存作为单独的功能。

相关问题