我已经构建了一个自定义自定义帖子挂钩,它返回 API 响应和 API 帖子。我正在使用useCallback
钩子来设置Response state
出错的地方是钩子Package prop
内部没有更新。useCallback
Package
当我在钩子外登录时,useCallback
我会在属性内获得正确的数据。但是,当我记录钩子Package prop
内部时useCallback
,值Package
不会改变。
不管我按了多少次按钮
我已经尝试创建一个state
每次Package prop
更新时都会更新的订单,但是每当我在其中设置Package
为一个值时,scope
我都会得到一个无限循环。
我已经添加Package
到钩子scope
中useCallback
例子
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);
};