Javascript 我能’;似乎无法从此函数中访问我的更新状态

Javascript 我能’;似乎无法从此函数中访问我的更新状态,javascript,reactjs,closures,react-hooks,Javascript,Reactjs,Closures,React Hooks,我有这样一种状态: const[指纹问题,设置指纹问题]=React.useState([]) 我有一个函数,它通过一堆数据进行循环验证。如果有错误,它会使用设置指纹问题将它们添加到指纹问题。那很好 但是在这个方法(缩写)中,我在方法的complete内部检查指纹问题,它总是返回[]。我已经读到了闭包和陈旧状态的问题,但我似乎看不出这在这里是如何应用的 const validateDocument=data=>{ 常数开始=力矩() 试一试{ Papa.LocalChunkSize=10485

我有这样一种状态:

const[指纹问题,设置指纹问题]=React.useState([])
我有一个函数,它通过一堆数据进行循环验证。如果有错误,它会使用
设置指纹问题
将它们添加到
指纹问题
。那很好

但是在这个方法(缩写)中,我在方法的
complete
内部检查
指纹问题,它总是返回
[]
。我已经读到了闭包和陈旧状态的问题,但我似乎看不出这在这里是如何应用的

const validateDocument=data=>{
常数开始=力矩()
试一试{
Papa.LocalChunkSize=10485
返回Papa.parse(数据{
完成:()=>{
//仅在20秒或更长时间内完成日志记录
常数端=力矩()
常数持续时间=时刻持续时间(结束差异(开始))
const seconds=Math.ceil(duration.asSeconds())
if(秒<分钟处理时间){
设置超时(()=>{
setUploadStep(“标记”)
console.log(“指纹问题”,指纹问题)
},(最小处理时间-秒)*1000)
}否则{
setUploadStep(“标记”)
}
},
错误:()=>{
setDocumentError(真)
setDocumentReady(错误)
},
})
…

有什么建议吗?

我认为这确实是一个闭包和过时状态的问题。在使用钩子时,您需要小心如何使用回调

组件函数被多次调用(每个渲染一次)。每个调用将接收特定状态。您可以将其视为特定状态与该特定渲染关联。如果在渲染中创建回调,则该回调将存在于创建该回调的渲染的闭包中。问题是,如果重新渲染组件,则回调仍存在于关闭旧的渲染,将看不到新状态

解决这一问题的一种方法是使用React.useRef,您可以阅读有关它的更多信息。ref包含一个值,可以随时修改和访问,而不考虑闭包。请注意,修改ref不会导致重新呈现组件

const fingerPrintingIssues = React.useRef([])
const validateDocument = data => {
    // Perform validation
    // Now access (refs are accessed by .current)
    console.log(fingerPrintingIssues.current)
}

// Modify:
fingerPrintingIssues.current.push(...)
如果在修改值时需要重新呈现组件,可以使用useRef()和useState()的组合