【发布时间】:2021-04-11 13:43:59
【问题描述】:
我有这个动作
export function fetchBranches() {
return async dispatch => {
const result = await axios.get('https://localhost:5002/Branches')
dispatch({ type: FETCH_BRANCHES, payload: result.data.value })
}
}
还有这样的减速器
export const branchReducer = (state = initialState, action) => {
switch (action.type) {
case FETCH_BRANCHES: {
return { ...state, branches: action.payload }
}
default: return state
}
}
在我的组件中,我正在尝试做这样的事情
const dispatch = useDispatch()
dispatch(fetchBranches())
const branches = useSelector(state => state.branches.branches)
return <>
some component that uses branches
</>
所以我的问题是我收到了无数个尝试获取的请求(我可以在 redux 开发工具中看到它们)。 我的页面没有得到更新,但是如果转到其他页面然后返回到尝试执行此提取的页面,我可以在商店和页面上看到值。所以问题是:
- 然后我应该在哪里以及如何调度操作来获取一些数据来呈现它?
- 为什么我会收到这么多请求,我该如何解决?
更新:
非常感谢您的回答,但我仍然看到我的组件在我从 api 接收数据之前呈现的行为。我想尝试useState 并在useEffect 中设置状态,但我不能使用useSelector。加载数据后,我应该怎么做才能重新渲染组件?
UPD2:现在我的组件看起来像
function BranchList() {
const [isLoaded, setIsLoaded] = useState(false)
const dispatch = useDispatch()
useEffect(() => {
dispatch(fetchBranches())
setIsLoaded(true)
}, [])
const branches = useSelector(state => state.branches.branches)
const headerNames = ["Id", "Name"]
if (!isLoaded) {
return <>Loading...</>
}
return (
<EditableTable
data={branches}
headerNames={headerNames}
onEditConfirm={(row) => dispatch(updateBranch(row))}
onDelete={(id) => dispatch(deleteBranch(id))} />
)
}
【问题讨论】:
-
您能提供您的组件的完整样本吗?你考虑过 useEffect 钩子吗?