reactjs - 组件重新渲染 React Material UI 时保持 Autocomplete 值
问题描述
我有一个 SelectForm 类组件,其中我使用多个带有嵌套 TextField 组件的 React Material Autocomplete 组件来显示单独的选项列表。选择选项时,自动完成字段的值存储在本地状态中。这个想法是,当用户选择所需的选项并提交表单时,isSubmitted
状态设置为true
并呈现结果组件,显示与选择匹配的结果。如果用户随后点击结果组件中的“编辑配置”按钮,则isSubmitted
state 设置为 false,这会触发 SelectForm 组件再次显示。在这个阶段,我希望自动完成字段中显示的文本是存储在状态中的文本(用户最初选择的选项)。然而,实际发生的是标签再次显示在字段中,而不是选定的选项,即使选项名称仍存储在本地状态中。
我尝试使用inputValue
Autocomplete 字段上的道具将值设置为相关的状态值。这确保了当 SelectForm 组件再次呈现时,字段中显示了正确的值,但该字段不再可编辑。我希望用户能够在该阶段根据需要对其进行编辑。
以下是状态和自动完成字段的一些片段。任何帮助将不胜感激。
状态
constructor(props) {
super(props);
this.state = {
isSubmitted: false,
form: {
cpuParent: '',
}
}
}
处理自动完成更改
handleAutocompleteChange = (name, option) => {
let value = '';
if (option) {
value = [option.name]
}
this.setState({
form: {
...this.state.form,
[name]: value
}
});
};
自动完成组件
{
cpuParentList &&
<Autocomplete
options={cpuParentList}
name={"cpuParent"}
getOptionLabel={(option) => option.name}
onChange={
(event, value, reason) => {
this.handleAutocompleteChange("cpuParent", value);
}
}
style={{width: '100%'}}
renderInput={
(params) =>
<TextField
{...params}
name={"cpuParent"}
label={"Select Brand"}
variant="outlined"
/>
}
/>
}
解决方案
我会假设您的自动完成选项是一个对象数组,因此您必须将值保存为对象,而不是字符串。
在这些行中:
handleAutocompleteChange = (name, option) => {
let value = '';
if (option) {
value = [option.name]
}
...
您正在像字符串数组一样保存值。
解决方案
- 您需要保存值
object
而不是字符串,因为您需要参考。 - 最后,您需要为 Autocomplete 组件提供值。
这是一个解决方案代码示例:
import React from "react";
import TextField from "@material-ui/core/TextField";
import Autocomplete from "@material-ui/lab/Autocomplete";
class TestAutoComplete extends React.Component {
constructor(props) {
super(props);
this.state = {
isSubmitted: false,
form: {
cpuParent: null
}
};
}
handleAutocompleteChange = (name, option) => {
this.setState({
form: {
...this.state.form,
[name]: option
}
});
};
render() {
// DEFAULT CPUPARENTLIST
const cpuParentList = [{ value: "item1", name: "Item 1" }];
return (
<div>
<Autocomplete
// PROVIDE VALUE
value={this.state.form.cpuParent}
options={cpuParentList}
name={"cpuParent"}
getOptionLabel={option => option.name}
onChange={(event, value, reason) => {
this.handleAutocompleteChange("cpuParent", value);
}}
style={{ width: "100%" }}
renderInput={params => (
<TextField
{...params}
name={"cpuParent"}
label={"Select Brand"}
variant="outlined"
/>
)}
/>
<p>Value Selected: {this.state.form.cpuParent ? this.state.form.cpuParent.name : ""}</p>
</div>
);
}
}
export { TestAutoComplete };
推荐阅读
- mongodb - MongoDB - 如何通过字符串操作更新值
- python - 如何制作一个绘图对象的副本?
- javascript - 在执行过程中动态自动缩放 Phaser 3 游戏
- powershell - Azure 管道 powershell 任务中的 Ant 命令
- c# - 为什么会失败?
- reactjs - React Boilerplate 无法修复点击事件
- wso2 - 如何在选择查询中将输入参数作为输出映射传递
- javascript - 在节点js中签名数据并在Java中验证
- vb.net - Word 互操作 (COM) 样式 LanguageID 不起作用
- c# - 从 PHP 执行存储过程导致“找不到存储过程”