如何更改 Material UI 自动完成弹出框的宽度

Vla*_*man 3 reactjs material-ui

当使用Select from Material-UI 时,有一个名为“autoWidth”的道具,它设置弹出框的宽度以匹配菜单内项目的宽度。

Autocomplete组件是否有类似的选项?

我想要实现的是 TextField 的宽度与菜单的宽度无关,并且菜单的宽度由菜单项而不是硬编码的“宽度”决定。

到目前为止我设法找到的是使用类为“纸”组件提供宽度的选项(请参阅下面的代码),但它与实际项目的宽度无关,并且纸的位置没有调整为留在里面窗户。

const styles = (theme) => ({
  paper: {
    width: "450px"
  }
});

function ComboBox(props) {
  return (
    <Autocomplete
      id="combo-box-demo"
      options={top100Films}
      classes={{
        paper: props.classes.paper
      }}
      getOptionLabel={(option) => option.title}
      style={{
        width: 300,
        paddingLeft: "100px"
      }}
      renderInput={(params) => (
        <TextField {...params} label="Combo box" variant="outlined" />
      )}
    />
  );
}
Run Code Online (Sandbox Code Playgroud)

链接到代码沙盒

我想要实现的是与此代码和框类似的行为,但使用的是自动完成组件。请注意,弹出菜单的宽度取自菜单项,而 Select 组件的宽度是硬编码的。

SaF*_*SaF 17

你可以传递这个道具:

componentsProps={{ popper: { style: { width: 'fit-content' } } }}
Run Code Online (Sandbox Code Playgroud)

自动完成组件

<Autocomplete
  ....
  componentsProps={{ popper: { style: { width: 'fit-content' } } }}
/>
Run Code Online (Sandbox Code Playgroud)

  • @VladiFeldman 这是比创建自定义 popper 组件更简单的方法...... (6认同)

Gio*_*ito 14

要基于菜单本身内部的元素创建动态菜单,您必须以PopperComponent这种方式自定义 Autocomplete 的属性:

  1. 定义自定义Popper

    const PopperMy = function (props) {
       return <Popper {...props} style={styles.popper} placement="bottom-start" />;
    };
    
    Run Code Online (Sandbox Code Playgroud)
  2. Popper样式中,将宽度设置为“fit-content”:

    const styles = (theme) => ({
       popper: {
          width: "fit-content"
       }
    });
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将组件传递PopperMy给自动完成:

    <Autocomplete
       PopperComponent={PopperMy}
       ...  
    />
    
    Run Code Online (Sandbox Code Playgroud)

是您修改的代码和框。

  • 感谢您详细的回答,但我正在寻找的与您所展示的相反。我希望自动完成(文本字段部分)保持相同的预定义宽度和菜单(打开并显示所有可用项目列表的窗口),其宽度取决于项目的长度。 (2认同)
  • @NachoLibre 在这种情况下,您必须以 Popper 样式设置宽度,但不能使用样式:您必须使用内联样式强制宽度样式。像 `&lt;Popper {...props} style={{ width: "370px" }}placement="bottom-start" /&gt;` 之类的东西。我不知道为什么它不适用于样式...... (2认同)