reactjs 将值从 useSelector 传递给 useEffect
reactjs passing value to useEffect from useSelector
我正在构建一个 reactjs 应用程序
我想从 redux 状态获取我的用户 ID
使用 useSelector 并将其传递给 useEffect
我的代码
UserReducer
export function userReducer(state = { token: "", user: {} }, action) {
switch (action.type) {
case "LOGIN":
return action.payload;
case "LOGOUT":
return action.payload;
default:
return state;
}
}
ViewTransaction.jsx
const ViewTransaction = () => {
const user_id = useSelector((state) => state.user.user.id);
const params = useParams();
useEffect(() => {
setLoading(true);
PendingServices.getPendingTransaction(
`localhost:8000/user/transaction/pending/get-transaction/${params.id}?user_id=${user_id}`
)
.then((response) => {})
.catch((error) => {})
.finally(() => {
setLoading(false);
});
}, []);
return (
<div>transaction</div>
)
}
export default ViewTransaction;
user_id 显示未定义。
你需要在 useEffect 依赖数组中传递 user_id
并检查它是否已定义或点头......因为首先呈现它未定义,因为 redux 尚未提供它
useEffect(() => {
if(user_id){
setLoading(true);
PendingServices.getPendingTransaction(
`localhost:8000/user/transaction/pending/get-transaction/${params.id}?user_id=${user_id}`
)
.then((response) => {})
.catch((error) => {})
.finally(() => {
setLoading(false);
});
}
}, [user_id]);
就像德鲁在上面的评论中写的那样,你的依赖数组缺少变量。 React 试图聪明地避免白白调用钩子,并且通过不传递任何依赖项,你让它假设对 useEffect 中方法的调用将始终相同,并且它可以缓存和重用调用结果。由于 user_id 一开始是未定义的,当没有人登录时, useEffect 与未定义用户的结果被缓存。
通过在 dep 数组中添加 user_id 和 params.id 你告诉 React “每次这些变量改变时,方法的结果也应该改变”,所以它会使缓存 useEffect 结果和 运行 方法。
我建议使用这个 eslint 插件来自动帮助捕捉这些情况:https://www.npmjs.com/package/eslint-plugin-react-hooks
我正在构建一个 reactjs 应用程序
我想从 redux 状态获取我的用户 ID
使用 useSelector 并将其传递给 useEffect
我的代码
UserReducer
export function userReducer(state = { token: "", user: {} }, action) {
switch (action.type) {
case "LOGIN":
return action.payload;
case "LOGOUT":
return action.payload;
default:
return state;
}
}
ViewTransaction.jsx
const ViewTransaction = () => {
const user_id = useSelector((state) => state.user.user.id);
const params = useParams();
useEffect(() => {
setLoading(true);
PendingServices.getPendingTransaction(
`localhost:8000/user/transaction/pending/get-transaction/${params.id}?user_id=${user_id}`
)
.then((response) => {})
.catch((error) => {})
.finally(() => {
setLoading(false);
});
}, []);
return (
<div>transaction</div>
)
}
export default ViewTransaction;
user_id 显示未定义。
你需要在 useEffect 依赖数组中传递 user_id
并检查它是否已定义或点头......因为首先呈现它未定义,因为 redux 尚未提供它
useEffect(() => {
if(user_id){
setLoading(true);
PendingServices.getPendingTransaction(
`localhost:8000/user/transaction/pending/get-transaction/${params.id}?user_id=${user_id}`
)
.then((response) => {})
.catch((error) => {})
.finally(() => {
setLoading(false);
});
}
}, [user_id]);
就像德鲁在上面的评论中写的那样,你的依赖数组缺少变量。 React 试图聪明地避免白白调用钩子,并且通过不传递任何依赖项,你让它假设对 useEffect 中方法的调用将始终相同,并且它可以缓存和重用调用结果。由于 user_id 一开始是未定义的,当没有人登录时, useEffect 与未定义用户的结果被缓存。
通过在 dep 数组中添加 user_id 和 params.id 你告诉 React “每次这些变量改变时,方法的结果也应该改变”,所以它会使缓存 useEffect 结果和 运行 方法。
我建议使用这个 eslint 插件来自动帮助捕捉这些情况:https://www.npmjs.com/package/eslint-plugin-react-hooks