reactjs - react hooks状态管理解决方案是否有redux-saga替代方案
问题描述
通过使用 React 16 hooks,我可以摆脱 redux 但仍然拥有状态管理功能,参考:https ://kentcdodds.com/blog/application-state-management-with-react
然而,我曾经使用 redux-saga 让一个监听器(或处理程序)在 reducer 处理一个动作后做一些异步的事情。问题是如果不依赖 redux、redux-saga,我不确定如何实现这一点。
换句话说,如果查看此处的示例:https ://codesandbox.io/s/4qzj73lozx?fontsize=14&hidenavigation=1&module=%2Fsrc%2F05-context-with-reducer.js
如何监听“增加”动作,在它发生时做一些异步的事情(不使用 redux-saga)。
解决方案
我正在使用 redux 和 redux-saga 进行异步操作,这在我的代码的可读性、调试和模块化方面非常舒适。但是,如果您想使用钩子来处理它,也可以通过创建自定义钩子来实现:
import React, { useState, useEffect } from 'react';
function useAsyncHook() {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(false);
useEffect(() => {
async function fetchData() {
try {
setLoading(true);
const res = await fetch(
`ENDPOINT`
);
const data = await res.json();
setData(data);
} catch (error) {
setLoading(false);
}
}
}, []);
return [data, loading];
}
然后你可以像这样使用它:
function App() {
const [data, loading] = useAsyncHook();
return (
<div>
{!loading && <p>Loading...</p>}
{data && data.map(item => {
return <div>{item}</div>;
})
)}
</div>
);
}
推荐阅读
- angular - 在 ngOnInit() 之后从动态添加的 HTML 中捕获点击事件
- jekyll - 图片不显示在 GitHub 页面中
- c - 递归删除树的所有节点
- c++ - 尝试使用 glLoadGen 时出现链接错误
- php - Laravel 5.6 Auth Register 使用一个字段
- javascript - js - 基于有序数组对数组中的元素进行排序
- swift - iOS swift deeplink https:// 或 http:// 架构
- c++ - CMake:Boost_INCLUDE_DIRS 始终设置为 /usr/include
- c++ - 为什么“在一个库中分配而在另一个库中释放”是错误的
- pipeline - Monogame 管道文件太大