【问题标题】:Lose state in React JsReact Js 中的丢失状态
【发布时间】:2020-03-25 12:00:22
【问题描述】:

我有一个有 2 个输入的应用程序;名称和密码。另外,我有一个保存按钮,它应该使用父组件中的输入值来更改状态。

但是现在,如果我在一个输入中只插入一个值,我会丢失父组件中的状态。例如,如果我只输入名称,然后单击保存按钮,在父组件中我会丢失密码值,但我不知道为什么。

如何使用我的代码避免这种情况?

import React, { useEffect } from "react";
import "./styles.css";

const Test = ({ user, setUser }) => {
  const [u, setU] = React.useState("");
  const [p, setP] = React.useState("");

  function name(e) {
    const a = e.target.value;
    setU(a);
  }

  function password(e) {
    const a = e.target.value;
    setP(a);
  }

  function save() {
    console.log(u);
    setUser({ ...user, name: u, password: p });
  }

  return (
    <div>
      <input onChange={name} />
      <input onChange={password} />
      <button onClick={save}>save</button>
    </div>
  );
};

export default function App() {
  const [user, setUser] = React.useState({
    name: "",
    password: ""
  });
  useEffect(() => {
    setUser({ name: "john", password: "Doe" });
  }, []);
  return (
    <div className="App">
      <p>{user.name}</p>
      <p>{user.password}</p>

      <Test user={user} setUser={setUser} />
    </div>
  );
}

代码链接:https://stackblitz.com/edit/react-ytowzg

【问题讨论】:

  • @Ramesh,为什么?我在我的子组件中使用了setUser({ ...user, name: u, password: p });。这会更新父状态吗?
  • 是的,应该。您所拥有的是一个逻辑错误,请参阅我的答案。
  • 它工作正常

标签: reactjs


【解决方案1】:

这应该可以解决您的问题:

  function save() {
    console.log(u);
    if(u === '') {
      setUser({ ...user, password: p });
    } else if (p === '') {
      setUser({ ...user, name: u });
    } else {
      setUser({ ...user, name: u, password: p });
    }
  }

因此,现在状态会根据输入字段的值有条件地更新。您的代码的问题在于,无论输入值如何,您总是会覆盖状态。

【讨论】:

    【解决方案2】:

    我有一个更好的提议,而不是为名称、密码和百分比使用单独的状态变量,而是使用单个状态变量对象

    Test.js

      import React, { useState } from "react";
        import { InputNumber } from "antd";
        import "antd/dist/antd.css";
    
        const Test = ({ user, setUser }) => {
          const [state, setState] = useState({
            name: "",
            password: "",
            percentage: ""
          });
    
          function onChange(e, name) {
            setState({
              ...state,
              ...(name === undefined
                ? { [e.target.name]: e.target.value }
                : { [name]: e })
            });
            console.log(state);
          }
    
      function save() {
        setUser({
          ...user,
          ...(state.name !== "" && { name: state.name }),
          ...(state.password !== "" && { password: state.password }),
          ...(state.percentage !== "" && { percentage: state.percentage })
        });
      }
    
    
          return (
            <div>
              <input name='name' onChange={onChange} />
              <input name='password' onChange={onChange} />
              <InputNumber
                defaultValue={100}
                min={0}
                max={100}
                formatter={value => `${value}%`}
                parser={value => value.replace("%", "")}
                onChange={e => onChange(e, "percentage")}
              />
              <button onClick={save}>save</button>
            </div>
          );
        };
    
    export default Test;
    

    更新了 CodeSandbox here

    【讨论】:

    • 我喜欢该代码,但如果我使用除了简单输入、ant design Input Number 之外的其他输入,我无法获得像 [e.target.name]: e.target.value 这样的输入名称。如何结合这种情况?
    • 我复制了这个问题。在这种情况下如何正确设置状态? stackblitz.com/edit/react-ytowzg
    • 我看看,等一下
    • 我已经更新了代码,这应该适用于Input Number simple input 和 antd Input
    • 如果要更改: const Test = ({ user, setUser }) => { const [state, setState] = useState({ name: "john", password: "Doe", percent: " 100" }); to : const Test = ({ user, setUser }) => { const [state, setState] = useState({ name: "", password: "", percent: "" });.当我尝试只保存一个值时出现问题,因为单击后其他值在父组件中消失。如果我只设置一个,如何保存这些值?
    猜你喜欢
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多