![](/img/trans.png)
[英]React setState inside useCallback() hook not setting state variable correctly?
[英]React | props inside UseCallBack not updating inside custom hook
我构建了一个自定义自定义帖子挂钩,它返回 API 响应和 API 帖子。 我正在使用useCallback
挂钩来设置Response state
出错的地方是Package prop
没有在useCallback
挂钩内更新。
当我在useCallback
挂钩之外记录Package
时,我在属性中得到了正确的数据。 但是,当我在useCallback
挂钩中记录Package prop
时, Package
的值不会改变。
不管我按了多少次按钮
I've tried creating an order state
that updates everytime the Package prop
updates, however whenever I set Package
as an value in the scope
I get an infinite loop.
我还在useCallback
钩子的scope
中添加了Package
例子
React.useEffect(() => {
setOrder(Package);
}, [Package]);
我期望发生的是,每当我调用我的自定义usePostOrder
挂钩时, Package
中的useCallback
的值总是与最新传递的道具保持同步。
自定义钩子
/**
* custom post hook that returns the API response and the API post function
* @param {string} url
* @param {object} Package
* @returns {array} and @param {function}
*/
export const usePostOrder = (url, Package) => {
const [loading, setLoading] = React.useState(true);
const [order, setOrder] = React.useState(Package);
const [response, setResponse] = React.useState({
config: {
data: []
},
data: {
id: 0
}
});
console.log("outside func", Package);
const postOrder = React.useCallback(async () => {
console.log("inside func", Package);
}, [url, loading, Package]);
return [response, postOrder];
};
Jake Luby 的回答稍作调整
/**
* custom post hook that returns the API response and the API post function
* @param {string} url
* @param {object} Package
* @returns {array} and @param {function}
*/
export const usePostOrder = (url, Package, send) => {
const [postOrder, setPostOrder] = React.useState();
const [response, setResponse] = React.useState({
config: {
data: []
},
data: {
id: 0
}
});
React.useEffect(() => {
const getData = async send => {
//this will have the updated input Package
await axios
.post(ApiUrl + url, Package)
.then(function(response) {
setResponse(response);
})
.catch(function(error) {
setResponse(error);
console.log(error);
});
};
send && getData();
}, [send]); //this will run when url or Package changes
return [response, postOrder];
};
useAsyncEndpoint.PropTypes = {
url: PropTypes.url,
user: PropTypes.object,
club: PropTypes.object,
cartItems: PropTypes.array
};
我怎么称呼这个钩子
import {usePostOrder} from "./yourHooksFolder"
const [send, setSend] = React.useState(false);
const [response, postOrder] = usePostOrder(
"url",
createOrder(user, store, cartItems),
send
);
React.useEffect(() => {
setSend(false);
}, [response]);
// send order
const onGoToPaymentPressed = () => {
setSend(true);
};
useCallback
并不意味着这样使用。 它实际上并没有运行 function,它只是简单地记住它,以便在渲染之间不会重新创建相同的 function。
您想要的是useEffect
钩子并将 postOrder 作为 state 的一部分:
export const usePostOrder = (url, Package) => {
const [postOrder, setPostOrder] = React.useState()
const [response, setResponse] = React.useState({
config: {
data: []
},
data: {
id: 0
}
})
React.useEffect(() => {
const getData = async url => {
//this will have the updated input Package
console.log(Package)
//here is where you'll have your REST calls
//set your data which will then update the return values in the hook and cause a rerender
setPostOrder(returnValue)
setResponse(someResponse)
}
getData()
}, [url, Package]) //this will run when url or Package changes
return [response, postOrder]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.