reactjs - 为什么我的 Material-ui React 组合框没有正确刷新?
问题描述
我为包含组合框的 React 组件准备了以下代码:
import React from 'react';
import MenuItem from '@material-ui/core/MenuItem';
import TextField from '@material-ui/core/TextField';
export default function MyTab() {
const [currentPhase, updatePhase] = React.useState(1);
function PhaseComponent() {
return <TextField select variant="outlined" label="Phase" defaultValue="1" onChange={e => updatePhase(e.target.value)}>
<MenuItem key={1} value="1">Phase 1</MenuItem>
<MenuItem key={2} value="2">Phase 2</MenuItem>
</TextField>
}
return <div>
<PhaseComponent />
</div>
}
执行代码后,当我在组合框中选择“阶段 2”时,我观察到的是:
- 状态(currentPhase)正确更新;
- 组合框错误地显示“阶段 1”;
- 如果我再次选择“阶段 2”,组合框会正确显示“阶段 2”。
请注意,我找到了几种使组合框显示正确值的方法:
- 将 PhaseComponent 移动到单独的文件中;
- 将 PhaseComponent 留在同一个文件中,但将其移出 MyTab();
- 在PhaseComponent
const [currentPhase, updatePhase] = React.useState(1);
内部移动; - 替换
<PhaseComponent />
为{PhaseComponent()}
; - 删除 onChange (但当然状态不会更新)。
有人可以解释一下这里发生了什么,为什么我原来的解决方案不起作用?我也很好奇为什么我的解决方法 4 有效。
解决方案
我刚刚找到了阅读<Component /> 和 Component() 之间的差异的问题的答案。
简而言之:
<PhaseComponent />
使组合框再次挂载并在选择后重新渲染,因此它采用默认值(即 1)。- 所描述的解决方案(如调用)
PhaseComponent()
没有这种效果。
推荐阅读
- android - 我无法在片段上设置 ClickListener RelativeLayout
- c# - 有没有办法删除数据网格视图上的数据绑定组合框中的选择线(突出显示)?
- kubernetes - 自定义调度程序将 pod 留在挂起的 Kubernetes 集群中
- openssl - suse openssl 未定义符号:private_CAST_set_key
- java - REST客户端和浏览器中Web应用程序中基本身份验证的不同处理
- javascript - Flow 中的可组合和正合约
- netflix-zuul - 有没有办法改变 netflix zuul 路由过滤器中的 http 请求方法?
- lua - 如何去混淆这个?
- python - 使用 Python 运行外部程序
- swift - Firebase 在调用下一个方法之前没有完成