如何从父项中清除MUI自动完成字段?

How to clear MUI Autocomplete field from parent?

提问人:hitech 提问时间:11/13/2023 最后编辑:hitech 更新时间:11/16/2023 访问量:52

问:

//PARENT COMPONENT

const App = () => {
const [filterData, setFilterData] = useState({
    //field id and names
    soldTo:"",
    soldToName:"",      
});

const handleChangeAuto = (name, value) => {
    setFilterData({
      ...filterData,
      soldTo: value !== null ? value.id : "",
      soldToName: value !== null ? value.name : "",
    });
  };

const removeTag = () => {
    setFilterData({ ...filterData, soldTo: "", soldToName: "" });
  };
return (<>
<FilterAutoCompleteField
                  label="Sold To"
                  name="soldTo"
                  value={filterData.soldToName}
                  onChangeAuto={handleChangeAuto}
/>
</>)

**<Button onClick={removeTag}>Reset</Button>**

主 App 组件具有 filterData 状态和 handleChangeAuto 函数,用于将自动完成数据分配给筛选器。

然后在父“App”组件中,“重置”按钮会触发 removeTag 函数,该函数会清除过滤器值。它应该重置自动完成文本字段,但它不会这样做。

//CUSTOM AUTOFIELD COMPONENT
const FilterAutoCompleteField = ({
  label,
  name,
  value,
  onChangeAuto,
}) => {
  data=[{id:0, name:"yo"},{id:1, name:"hello"}, {id:2, name:"wow"}]

  const { id } = useId();
 

  return (
    <Grid item xs={12} md={4}>
      <InputLabel>{label}</InputLabel>
      <Autocomplete
        disablePortal
        id={id}
        options={data}
        value={value}
        inputValue={value}
        getOptionLabel={(option) => option.name}
        onChange={(event, newValue) => {
          onChangeAuto(name, newValue);
        }}
        renderInput={(params) => <TextField {...params} />}
      />
    </Grid>
  );
};

当我单击重置按钮时,控制台窗口中的“filterData”被重置,但“自动完成”文本字段仍然具有旧字段。这就像 FilteredAutoComplete 字段未更新或呈现一样。

我尝试在removeTag中传递null值。那也行不通。

编辑:在这里,我在filterData中传递了soldTo和soldTo项。但是该对象是通过变量动态传递的。这导致它不呈现该部分。如何在 filterData 状态下传递 filterObject 时解决此问题。

 const filterObject = [{soldTo:"", soldToName:""}]
  const [filterData, setFilterData] = React.useState({
    //field id and names
    // soldTo: '',
    // soldToName: '',
    ...filterObject
  });

尽管 filterData 状态已更改。“自动完成”中的文本不会被清除。这里是链接:https://stackblitz.com/edit/stackblitz-starters-8d5hed?file=src%2FApp.js

reactjs material-ui 自动完成

评论

0赞 TheKritsakon 11/20/2023
在第 41 行,如果拆分数组,它将创建一个状态为 { 0: { soldTo: '', soldToName: '' } },这是错误的 DS,导致自动完成接收到 undefined 的错误数据,因为 filterData.soldToName 它会导致 undefined。将 useState 定义为 const [filterData, setFilterData] = React.useState({ soldTo: '', soldToName: '' })

答:

0赞 TheKritsakon 11/13/2023 #1

我只是在编译时发现了一个错误,我做了一些调整,代码本身很好。 我所做的调整:

  • 对变量数据进行正确的声明const data = ....
  • 删除设置状态上的状态分布
  • 删除 useId 钩子

这里代码的链接:StackBlitz

也许您可以检查的另一件事是组件导入

评论

0赞 hitech 11/13/2023
谢谢。当我在 2 天后可以访问代码时,我将实施建议的更改。如果它有效,我会告诉你。谢谢:)
0赞 hitech 11/16/2023
嗨,你能看看我的代码吗,@thekritsakon?我已经为问题添加了上下文。