javascript - React 钩子状态在父组件中更新但子组件没有收到新的道具
问题描述
我正在使用一个 css 网格布局,它根据屏幕大小具有不同数量的列和行。
import React, { useState, useEffect } from 'react'
function Main() {
const [numRows, setNumRows] = useState(10)
const [numColumns, setNumColumns] = useState(10)
const layoutList = [
<Content {...props} />,
<Content {...props2} />,
<Profile {...props3} numColumns={numColumns} />,
]
const [layout, setLayout] = useState(layoutList)
let gridCount = () => {
//code to count number of columns and rows
//uses setNumRows and setNumColumns passed down as props
}
}
创建组件的布局后,我定义了一个函数来计算行数和列数。
useEffect(() => {
gridCount()
window.addEventListener("resize", gridCount)
})
我添加了一个有效的调整大小事件监听器,我可以看到父组件 Main 中的状态正在更新。但是,当我检查子组件 Profile 的状态时,我看到它已用 10 初始化,但再也不会被访问,即使 Main 状态正在正确更新,也没有发送新的 props。我试图在孩子身上重新渲染,但我不确定为什么父母没有发送更新的道具,父母的任何状态变化都应该导致重新渲染正确吗?
解决方案
很难从可用的代码中准确判断,但我怀疑孩子们没有收到新的道具,因为这些孩子们存储在状态中并且从未更新过。
要解决此问题,您应该在更新numRows
或更新时更新子级numColumns
。由于通常没有充分的理由将子项存储在状态变量中(并且可能会导致这样的问题,您必须手动告诉子项进行更新而不是让 React 处理),我建议删除状态存储完全和只是让layout
孩子们像往常一样。只需layoutList
直接在您返回的元素中使用。
推荐阅读
- javascript - 链接到 v-for 内的子路由的 router-link 被多次调用(Vue.js 2)
- javascript - 具有和不具有浏览器缩放的相同鼠标位置 (x,y)
- fortran - 为什么 f2py 中的接口定义会引发“语法错误”和“接口块中的意外数据声明语句”错误?
- python - 使用 Spark 读取特定文件(仅限精确匹配)
- node.js - 如何在 nodejs 应用程序中使用 async-lock 来锁定 /get 资源功能
- angular - 斯巴达克斯如何删除结帐登录页面
- apache - 如何通过 Apache2 启用与 websocket 的连接?
- ios - 如何在 SwiftUI 中更改步进图标的前景色?
- javascript - 更改范围输入值的功能不起作用
- javascript - 类型错误“原始”参数必须是函数类型