账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    條件執行 react hook出錯 "React hook useState is called conditional"
    37
    0

    有时候设计一个元件的 props 和 state,会参考 React 的 <input> 的 props: "defaultValue", "value", "onChange" 来达成若 props 有则用 props,若没有则用 component 自有的 state。

    可執行範例 [https://codesandbox.io/s/oo03...]

    如果用 useState 来设计一个 <Counter> 的话,会报错误"React hook useState is called conditionally",如 React 文件 "" 所写,React Hook 依赖执行顺序 ( React relies on the order in which Hooks are called )。

    useState <Counter />

    const Counter = ({ value, onChange, defaultValue = 0 }) => {
      const [count, onCountChange] =
        typeof value === "undefined" ? useState(defaultValue) : [value, onChange];
      return (
        <div>
          {count.toString()}
          <button
            onClick={() => {
              onCountChange(count + 1);
            }}
          >
            +
          </button>
        </div>
      );
    };
    function App() {
      const [count, onCountChange] = useState(0);
      return (
        <div className="App">
          <div>
            Uncontrolled Counter
            <Counter />
          </div>
          <div>
            Controlled Counter
            <Counter value={count} onChange={onCountChange} />
          </div>
        </div>
      );
    }

    如果是 class 元件我会这样写

    class <CounterClass />

    
    class CounterClass extends React.Component {
      state = {
        value: this.props.defaultValue || 0
      };
      render() {
        const isControlled = typeof this.props.defaultValue === "undefined";
        const count = isControlled ? this.props.value : this.state.value;
    
        return (
          <div>
            {count.toString()}
            <button
              onClick={() => {
                isControlled &&
                  this.props.onChange &&
                  this.props.onChange(this.props.value + 1);
                !isControlled && this.setState({ value: this.state.value + 1 });
              }}
            >
              +
            </button>
          </div>
        );
      }
    }
    

    请问这样的元件设计想法有什么错误吗?
    在 React Hook 的写法中,该怎么改善比较好呢?

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 雪流狼云 普通会员 1楼

      這可能意味著你在使用useState Hook時遇到了錯誤。useState Hook是一種React useState API,它允許你在React組件中使用一個簡單的函數來存儲和更新數據。 在使用useState Hook時,你應該確保你正在使用的是正確的函數名稱,因為這可能與React其他hook的名稱不匹配。例如,如果你使用的是useState Hook來處理當前日期,你應該確保你使用的是useState当前日期,而不是useState当前日期 如果你在使用useState Hook時遇到错误,你可以參考React的官方文档,或者使用React Developer工具來檢查你的設定和錯誤。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部