reactjs - 反应渲染状态子组件变量未更新?
问题描述
我有一个正在被调用的组件,然后用更新的信息再次调用,但topics
反应没有更新 var。有人可以解释为什么第一个示例没有在屏幕上更新,但第二个示例可以吗?它与 useState 调用有关吗?
App.js 在初始渲染期间调用一次 DisplayQuestions,然后页面接受用户输入并重新渲染。
<DisplayQuestionsByTopic topics={topics} />
.....
主题变量未在屏幕上更新:
export function DisplayQuestionsByTopic(props) {
console.log(`DisplayQuestionsByTopic`, props.topics)
const [topics, setTopics] = useState(props.topics) //<<<<<<<<
render(<h1>topics.join(',')</h1>)
}
主题 var 已在屏幕上更新:
export function DisplayQuestionsByTopic(props) {
console.log(`DisplayQuestionsByTopic`, props.topics)
render(<h1>props.topics.join(',')</h1>) //<<<<<<<<<<<
}
解决方案
传递给的参数useState
仅在组件第一次渲染时才被考虑 - 即在安装时。在安装时,道具被放入topics
状态。在进一步的渲染中,对 prop 的更改不会导致 state 的更改,因为 state 之前已经被初始化为其初始值。
虽然您可以useEffect
在道具更改时更改子项的状态:
useEffect(() => {
setTopics(props.topics);
}, [props.topics]);
除非您在setTopics
某处使用,否则仅渲染道具会更有意义,就像您在最终片段中所做的那样。
如果确实需要setTopics
在子级中执行,请考虑从父级传递状态设置器 - 这样,所有状态都在父级中处理,并且不同组件中没有重复的状态持有者需要同步.
推荐阅读
- ios - 如何在swift 4中跳过精确的小时和分钟时间的四舍五入
- r - 在 Rvest 中存在 vs is.null
- javascript - 为什么这个 debounce 和 Interval 不起作用?
- windows - MSMQ 4.0 从域 Devmachine 访问私有队列和开发 Docker 容器
- ios - self.navigationController?.popToRootViewController(animated: true) 不会关闭任何呈现的视图控制器
- excel - Excel中关于数据透视表的查询
- c# - CosmosDB C# SDK 中不区分大小写的字符串搜索
- android - Flutter 验证器仅在双击时触发
- java - aws SES 535 身份验证凭证无效
- sql-server - 如何动态定义这些表列?