插件窝 干货文章 简化 React 状态管理:处理状态的最佳实践

简化 React 状态管理:处理状态的最佳实践

状态 amp gt false 643    来源:    2024-10-20

有时候,我们必须在react状态下管理状态。
比如我们有一个提交表单,我们要管理表单的状态。

表达状态的方式有很多种。
我会介绍一下表达身份的坏例子。

坏榜样

1、用物体来表达状态。

const page = () => {
    const [status, setstatus] = usestate({ loading: false, error: false, success: false });

    const fetchuser = async () => {
        setstatus({ loading: true, error: false, success: false });
        try {
            const user = await api.getuser();
            setstatus({ loading: false, error: false, success: true });
        } catch (e) {
            setstatus({ loading: false, error: true, success: false });
        }
    };

    return (
        
            {status.loading &amp;&amp; <div>loading...</div>}
            {status.error &amp;&amp; <div>error...</div>}
            {status.success &amp;&amp; <div>success...</div>}
            <button onclick="{fetchuser}">fetch</button>
        &gt;
    );
};

这是一个不好的例子,因为状态非常复杂。
当您更新状态时,您必须更新所有状态。

此示例中只有三种状态模式。

// loading
setstatus({ loading: true, error: false, success: false });

// success
setstatus({ loading: false, error: false, success: true });

// error
setstatus({ loading: false, error: true, success: false });

但是当你用一个对象来表达状态时,读者无法理解只有三种模式。
所以这是一个坏例子。

2.用索引来表示状态。

const page = () =&gt; {
    const [status, setstatus] = usestate(3);
    const [user, setuser] = usestate<user null>(null);

    const fetchuser = async () =&gt; {
        setstatus(0);
        try {
            const user = await api.getuser();
            setuser(user);
            setstatus(2);
        } catch (e) {
            setstatus(1);
        }
    };

    const reset = () =&gt; {
        setuser(null);
        setstatus(3);
    };

    return (
        
            {status === 0 &amp;&amp; <div>loading...</div>}
            {status === 1 &amp;&amp; <div>error...</div>}
            {status === 2 &amp;&amp; <div>{user?.name}</div>}
            <button onclick="{fetchuser}">fetch</button>
            <button onclick="{reset}">reset</button>
        &gt;
    );
};
</user>

这是一个非常简单的例子。
但这个例子也有一个问题。

当你使用索引来表达状态时,你必须记住状态号。
如果您需要添加新状态,则必须更新所有状态编号。

所以,这也不是一个好例子。

3.为每个状态创建状态。

const page = () =&gt; {
    const [loading, setloading] = usestate<boolean>(false);
    const [error, seterror] = usestate<boolean>(false);
    const [success, setsuccess] = usestate<boolean>(false);
    const [user, setuser] = usestate<user null>(null);

    const fetchuser = async () =&gt; {
        setloading(true);
        try {
            const user = await api.getuser();
            setuser(user);
            setsuccess(true);
        } catch (e) {
            seterror(true);
        }
    };

    const reset = () =&gt; {
        setuser(null);
        setloading(false);
        seterror(false);
        setsuccess(false);
    };

    return (
        
            {loading &amp;&amp; <div>loading...</div>}
            {error &amp;&amp; <div>error...</div>}
            {success &amp;&amp; <div>{user?.name}</div>}
            <button onclick="{fetchuser}">fetch</button>
            <button onclick="{reset}">reset</button>
        &gt;
    );
};
</user></boolean></boolean></boolean>

这也不是一个好例子。
你必须一直管理函数中的所有状态。

如果您忘记更新状态,这将是一个错误。
重置功能也很复杂。

推荐

  1. 使用字符串来表达状态。
const Page = () =&gt; {
    const [status, setStatus] = useState('idle');
    const [user, setUser] = useState<user null>(null);

    const fetchUser = async () =&gt; {
        setStatus('loading');
        try {
            const user = await api.getUser();
            setUser(user);
            setStatus('success');
        } catch (e) {
            setStatus('error');
        }
    };

    const reset = () =&gt; {
        setUser(null);
        setStatus('idle');
    };

    return (
        
            {status === 'loading' &amp;&amp; <div>Loading...</div>}
            {status === 'error' &amp;&amp; <div>Error...</div>}
            {status === 'success' &amp;&amp; <div>{user?.name}</div>}
            <button onclick="{fetchUser}">Fetch</button>
            <button onclick="{reset}">Reset</button>
        &gt;
    );
};
</user>

这是一个非常简单的例子。
而且您可以轻松了解状态。

当您需要添加新状态时,您可以轻松添加新状态。
当然这个例子也有缺点。
无法同时表示加载状态和成功状态。
但我觉得这并不是什么大问题。

所以如果你在react状态下管理状态,我建议使用字符串来表达状态。

结论

在react状态中管理状态时,使用字符串来表达状态。

这非常简单易懂。
并且您可以轻松添加新状态。

如果使用对象或索引来表达状态,则在添加新状态时必须更新所有状态。
所以,我建议使用字符串来表达状态。

感谢您的阅读。