
有时候,我们必须在react状态下管理状态。
比如我们有一个提交表单,我们要管理表单的状态。
表达状态的方式有很多种。
我会介绍一下表达身份的坏例子。
const page = () => {
const [status, setstatus] = usestate<{ loading: boolean, error: boolean, success: boolean }>({ 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 && <div>loading...</div>}
{status.error && <div>error...</div>}
{status.success && <div>success...</div>}
<button onclick={fetchuser}>fetch</button>
</>
);
};
这是一个不好的例子,因为状态非常复杂。
当您更新状态时,您必须更新所有状态。
此示例中只有三种状态模式。
// loading
setstatus({ loading: true, error: false, success: false });
// success
setstatus({ loading: false, error: false, success: true });
// error
setstatus({ loading: false, error: true, success: false });
但是当你用一个对象来表达状态时,读者无法理解只有三种模式。
所以这是一个坏例子。
const page = () => {
const [status, setstatus] = usestate<0 | 1 | 2 | 3>(3);
const [user, setuser] = usestate<user | null>(null);
const fetchuser = async () => {
setstatus(0);
try {
const user = await api.getuser();
setuser(user);
setstatus(2);
} catch (e) {
setstatus(1);
}
};
const reset = () => {
setuser(null);
setstatus(3);
};
return (
<>
{status === 0 && <div>loading...</div>}
{status === 1 && <div>error...</div>}
{status === 2 && <div>{user?.name}</div>}
<button onclick={fetchuser}>fetch</button>
<button onclick={reset}>reset</button>
</>
);
};
这是一个非常简单的例子。
但这个例子也有一个问题。
当你使用索引来表达状态时,你必须记住状态号。
如果您需要添加新状态,则必须更新所有状态编号。
所以,这也不是一个好例子。
const page = () => {
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 () => {
setloading(true);
try {
const user = await api.getuser();
setuser(user);
setsuccess(true);
} catch (e) {
seterror(true);
}
};
const reset = () => {
setuser(null);
setloading(false);
seterror(false);
setsuccess(false);
};
return (
<>
{loading && <div>loading...</div>}
{error && <div>error...</div>}
{success && <div>{user?.name}</div>}
<button onclick={fetchuser}>fetch</button>
<button onclick={reset}>reset</button>
</>
);
};
这也不是一个好例子。
你必须一直管理函数中的所有状态。
如果您忘记更新状态,这将是一个错误。
重置功能也很复杂。
const Page = () => {
const [status, setStatus] = useState<'loading' | 'error' | 'success' | 'idle'>('idle');
const [user, setUser] = useState<User | null>(null);
const fetchUser = async () => {
setStatus('loading');
try {
const user = await api.getUser();
setUser(user);
setStatus('success');
} catch (e) {
setStatus('error');
}
};
const reset = () => {
setUser(null);
setStatus('idle');
};
return (
<>
{status === 'loading' && <div>Loading...</div>}
{status === 'error' && <div>Error...</div>}
{status === 'success' && <div>{user?.name}</div>}
<button onClick={fetchUser}>Fetch</button>
<button onClick={reset}>Reset</button>
</>
);
};
这是一个非常简单的例子。
而且您可以轻松了解状态。
当您需要添加新状态时,您可以轻松添加新状态。
当然这个例子也有缺点。
无法同时表示加载状态和成功状态。
但我觉得这并不是什么大问题。
所以如果你在react状态下管理状态,我建议使用字符串来表达状态。
在react状态中管理状态时,使用字符串来表达状态。
这非常简单易懂。
并且您可以轻松添加新状态。
如果使用对象或索引来表达状态,则在添加新状态时必须更新所有状态。
所以,我建议使用字符串来表达状态。
感谢您的阅读。
以上就是简化 React 状态管理:处理状态的最佳实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号