【问题标题】:How can I change the width of Material UI Autocomplete popover如何更改 Material UI 自动完成弹出框的宽度
【发布时间】:2020-08-25 12:56:23
【问题描述】:

使用 Material-UI 中的 Select 时,有一个名为“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" />
      )}
    />
  );
}

link to codesandbox

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

【问题讨论】:

    标签: reactjs material-ui


    【解决方案1】:

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

    1. 定义一个自定义Popper

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

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

      <Autocomplete
         PopperComponent={PopperMy}
         ...  
      />
      

    Here 是您的密码箱已修改。

    【讨论】:

    • 感谢您的详尽回答,但我正在寻找的与您所展示的相反。我希望自动完成(TextField 部分)保持相同的预定义宽度和菜单(打开并显示所有可用项目列表的窗口),其宽度取决于项目的长度。跨度>
    • @VladiFeldman 例如,您希望电影标题“Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb”出现在菜单的 1 行(而不是 2 行)正确?
    • 正确的先生!菜单的宽度应该由里面的项目决定。
    • @VladiFeldman 我已经更新了我的答案(和代码框)。我希望这就是你要找的:)
    • @NachoLibre 在这种情况下,您必须以 Popper 样式设置宽度,但您不能使用样式:您必须强制使用内联样式的宽度样式。像&lt;Popper {...props} style={{ width: "370px" }} placement="bottom-start" /&gt; 这样的东西。我不知道为什么它不适用于样式...
    【解决方案2】:

    您是否查看过自动完成 api 的“fullWidth”属性?

    https://material-ui.com/api/autocomplete/

    这是一个我认为可以满足您要求的示例

    https://codesandbox.io/s/full-width-autocomplete-ph30d?file=/demo.js

    fullWidth 如果为真,将取其容器的宽度:

    【讨论】:

    • 'fullWidth' 使自动完成组件占据其容器的整个宽度。我不想改变整个组件的宽度,只改变菜单本身。
    • 查看我附加的演示链接,您可以保持自动完成宽度与菜单宽度不同。
    • 请查看我的最新编辑。我添加了另一个沙箱,其中包含具有所需行为的 Select 组件。
    【解决方案3】:

    根据material官方文档可以通过styleprops:

    <Autocomplete
          id="combo-box-demo"
          options={top100Films}
          style={{ width: "450px" }}
          getOptionLabel={(option) => option.title}
          renderInput={(params) => (
            <TextField {...params} label="Combo box" variant="outlined" />
          )}
        />
    
    

    这里是演示:https://codesandbox.io/s/material-demo-forked-qon1b

    【讨论】:

    • 将样式传递给自动完成组件将改变整个组件的宽度。我想要实现的是 TextField 的宽度与菜单的宽度无关。
    • 感谢您的快速回答。我会更新我的问题以使其更清楚。
    • 啊,我理解错了。不能直接在TextField上设置样式吗?
    • 同样,问题不在于 TextField 而在于 Menu。
    • 你能举一个例子或更好的图像。你想做什么?
    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 2020-10-11
    • 1970-01-01
    • 2020-08-07
    • 2021-06-05
    • 2011-06-04
    • 2018-08-19
    • 2021-03-02
    相关资源
    最近更新 更多