【问题标题】:Handling errors using React's useState使用 React 的 useState 处理错误
【发布时间】:2019-03-07 20:19:28
【问题描述】:

如果我有一个类似于下面的组件:

import React, { useState } from "react";
import ReactDOM from "react-dom";

function calculateNewValueAndMaybeError(test) {
  try {
    // do something with test that might error
    // const newTest = functionThatMightError(...)
    // if it doesn't error, return { value: newTest, error: '' }
  } catch (err) {
    // is it correct to now return this in case of error?
    // return { value: test.value, error: 'Something went wrong' }
  }
}

function App() {
  const [test, setTest] = useState({ value: "", error: "" });
  return (
    <div>
      <p>Test: {test.value}</p>
      <p>Error: {test.error}</p>
      <button onClick={() => setTest(calculateNewValueAndMaybeError(test))}>
        Click me
      </button>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

我有一个按钮可以改变我的变量的状态,称为test,有没有办法处理错误,而不必一直在内部传递值和错误的对象?

否则,这不会导致有时像下面这样的必要代码:

onChange={() => setTest({ value: e.target.value, error: test.error })}

您想要更新test.value 的值但保留test.error 的值。

我觉得我缺少一些明显的东西。

谢谢!

【问题讨论】:

    标签: javascript reactjs react-hooks


    【解决方案1】:

    需要合并两个状态表明它们应该作为不同的状态处理:

    function App() {
      function calculateNewValueAndMaybeError(test) {
        try {
          ...
          setValue(...);
          setError(null);
        } catch (err) {
          setError('Something went wrong');
        }
      }
    
      const [error, setError] = useState(null);
      const [value, setValue] = useState('');
      return (
        <div>
          <p>Test: {value}</p>
          <p>Error: {error}</p>
          <button onClick={() => setTest(calculateNewValueAndMaybeError(test))}>
            Click me
          </button>
        </div>
      );
    }
    

    或者可以使用自定义状态挂钩来合并error 字段:

    const useErrorState = initialState => {
      const [state, setState] = useState({ ...initialState, error: null });
      const setErrorState = useCallback(stateUpdater => {
        if (typeof stateUpdater === 'function') {
          setState(state => {
            try {
              return {error: null, ...stateUpdater(state) };
            } catch (error) {
              return {...state, error };
            }
          });
        } else {
          setState({error: null, ...stateUpdater });
        }
      }, []);
    
      return [state, setErrorState];
    }
    

    另一种可能性是将错误处理移至父组件(可能带有高阶组件)并在那里捕获错误。

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 2019-12-11
      • 2020-04-15
      • 2020-07-20
      • 2018-01-28
      • 2018-08-01
      相关资源
      最近更新 更多