javascript - 反应 | UseCallBack 内的道具未在自定义挂钩内更新
问题描述
我已经构建了一个自定义自定义帖子挂钩,它返回 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);
};
解决方案
useCallback
不应该这样使用。它实际上并不运行该函数,它只是将其记忆,以便在渲染之间不会重新创建相同的函数。
您想要的是useEffect
钩子并将 postOrder 作为状态的一部分:
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]
}
推荐阅读
- python-3.x - 针对特定因素的 Pandas 'get_dummies'
- c# - 创建随机数并将它们存储在数组中
- sql - 如何在 DDL 中使用子查询?与 Oracle SQL Developer 相关的问题
- woocommerce - WooCommerce 产品图像交换在翻转时隐藏第一张图像
- javascript - 图片需要很长时间才能加载
- python - virtualenv 在 Windows 上无法正常工作
- android - 以编程方式连接 vpn 为 android ios 做出本机反应
- python - 显示关系的图表 - 多个非数字列
- css - CSS选择跨度
- sql - 未触发 SQL 继续处理程序