【问题标题】:How to use useState properly in this example?在这个例子中如何正确使用 useState?
【发布时间】:2019-12-02 12:49:41
【问题描述】:

我有以下代码:

const [data, setData] = useState({
        name: '',
        surname: '',
        email: '',
        password: ''   
    });

但是,我需要有类似的东西:

 const [name, setName] = useState('');
 const [surname, setSurname] = useState('');
 const [email, setEmail] = useState('');
 const [password, setPassword] = useState('');

但仍保留 setData() 函数,因为它已被使用。

【问题讨论】:

  • @DavinTryon 这不是真的。如果你传递一个只有 name 属性的对象,它将覆盖完整的数据。

标签: javascript html reactjs redux state


【解决方案1】:

您可以添加一个函数,该函数将接受您的所有参数并使用您定义的useState 方法。

这样您也可以自定义和检查参数的值。

所以它会像下面这样:

function Example() {
    const [name, setName] = useState('');
    const [surname, setSurname] = useState('');
    const [email, setEmail] = useState('');
    const [password, setPassword] = useState('');

    function changeData({name, surname, email, password}){
        // call your setSates here
        setName(name)
        setName(surname)
        setName(email)
        setName(password)
    }

}

注意,如果你想检查要传递的参数,你必须检查它们不是undefined。如果你不检查它会将变量设置为undefined

【讨论】:

    【解决方案2】:

    如果我理解正确,您正在寻找的解决方案如下:

    function MyComponent(props) {
      const [data, setData] = React.useState({
        name: '',
        surname: ''
      })
    
      // will use `useEffect` as an example with an API call
      React.useEffect(() => {
        SomeAPICall()
          .then((data) => {
            setData({ 
              ...data, 
              name: data.name
            })
          })
      })
    }
    

    调用setState 时,您需要复制当前状态并更新所需的属性。


    或者,您可以使用React.useReducer 来完成同样的事情:

    function MyComponent(props) {
      const [state, setState] = React.useReducer((p, n) => ({ ...p, ...n }), {
        name: '',
        surname: ''
      });
    
      // will use `useEffect` as an example with an API call
      React.useEffect(() => {
        SomeAPICall().then((data) => {
          setState({ 
            ...state, 
            name: data.name
          })
        })
      })
    }
    

    同样,您需要获取旧状态并使用新值更新它,然后将其传递给setState


    spread syntax 将现有对象的属性复制到新对象上。如果您不熟悉这种方法,这里有一些参考:

    【讨论】:

    • 这是钩子的工作方式,所以你总是需要把旧状态和新/下一个状态合并。
    • 你的两个例子有什么区别?
    • 最终结果是相同的,但我只是展示了两种不同的方法,您可以使用它们来完成相同的事情。 React.useState 可能更容易理解,所以我现在就坚持下去,如果你有一些更复杂的逻辑要处理,请转到 React.useReducer
    【解决方案3】:

    您可以使用 setData 更新单个属性。

    const [data, setData] = useState({
        name: '',
        surname: '',
        email: '',
        password: ''   
    });
    
    const setValue = (fieldName, value) => setData({...data, [fieldName]: value});
    
    // to update name
    setValue("name", "bob");
    

    【讨论】:

    • 谢谢,我必须用setValue("name", "bob");,可以不用" "吗?
    • 你不能传递没有“”的名字。如果你不带“”传递,它会找到未定义的名称变量。
    • 所以是setValue("booleanCheck", "true");?
    • 不,我的意思是第一个参数应该是字符串,第二个可以是任何值。
    • 如果有更多字段要更改,而不仅仅是名称?
    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 2021-05-05
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多