javascript - 当它已经在 useEffect 回调中设置时,为什么在 const 中未定义 useState 变量?
问题描述
我正在尝试访问由 useState 创建的变量,但是当我尝试访问它时它是未定义的。当我使用 useClick 调用该函数时,我可以访问它,但当我将它放在 useEffect 中时不能访问它。
function Viewer(props) {
const [lines, setLines] = useState()
const [linesToDisplay, setLinesToDisplay] = useState()
useEffect(() => {
if (props.json != undefined) {
let l = props.json.lines.map((item => <Line json={item} />))
setLines(l) // Lines are set.
setLinesToDisplay(
renderLinesAsColumns // Next, call renderLinesAsColumns.
)
}
}, []
)
const renderLinesAsColumns = () => {
var result = []
lines.forEach(line => { // ERROR: "lines is undefined". But lines was already set!
result.push(line)
})
setLinesToDisplay(result) // set lines to display
}
}
为什么会这样?我可以确认lines
之前已经设置过renderLinesAsColumns
被调用过。
解决方案
误解是当你打电话时
setLines(l) // Lines are set.
它实际上是
setLines(l) // Lines will be set, the next time we render.
但是由于您renderLinesAsColumns
在下一次渲染之前调用,所以当您调用它时,lines
仍然是未定义的。然后当它再次渲染时,它永远不会renderAsLinesAsColumns
用更新的值调用。
你可能想做:
useEffect(() => {
if (props.json != undefined) {
let l = props.json.lines.map((item => <Line json={item} />))
setLines(l) // Lines are set.
}
}, [])
useEffect(() => {
if (lines && lines.length) {
setLinesToDisplay(
renderLinesAsColumns // Next, call renderLinesAsColumns.
);
}
}, [lines])
推荐阅读
- sql - 如何设计n个多对多关系以使sql查询更容易
- reactjs - 如何在带有反应导航的某些内容之后拥有一个嵌套导航器
- android - 处理Android导航组件中的向上按钮
- angular - 修改 package.json 文件时应该运行哪个命令?
- python - 带冒号和不带冒号的数组索引之间的差异
- ruby-on-rails - Registration::Car::StepOne 的未定义方法“delegate_fields_to”
- logging - 应用程序日志不显示在 Wepsphere 的 SystemOut.log 中
- python-2.7 - 人们如何知道哪个字节用于某些任务 - python 套接字
- c++ - 通过 std::vector 的迭代似乎只在一个函数中被破坏
- amazon-web-services - 为 docker swarm(集群)打开的端口