我正在try 为material ui select组件实现自己的图标.到目前为止,我已经使用"IconComponent"MU select属性更改了默认图标.

但是,当菜单列表打开时,新图标不会旋转,就像默认图标一样,而且,具有值的菜单在单击时不会打开.仅当我单击" Select 组件"本身,而不是"新建"图标时,才会显示ListItem.

我测试了两个不同的图标(anotherIcon和newIcon),问题依然存在.

const newIcon = (
  <svg
    width="38"
    height="38"
    viewBox="0 0 38 38"
    fill="none"
    xmlns="http://www.w3.org/2000/svg"
  >
    <rect x="0.5" y="0.5" width="37" height="37" rx="9.5" stroke="#222426" />

    <svg
      width="18"
      height="12"
      x="10"
      y="13"
      viewBox="0 0 18 12"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
    >
      <path
        d="M0.66732 0.999999L8.72964 10.8681C8.76363 10.9095 8.80536 10.9428 8.85208 10.9655C8.89879 10.9882 8.94943 11 9.00065 11C9.05187 11 9.10251 10.9882 9.14922 10.9655C9.19594 10.9428 9.23767 10.9095 9.27167 10.8681L17.334 1"
        stroke="#222426"
        stroke-linecap="round"
        stroke-linejoin="round"
      />
    </svg>
  </svg>
);

      <FormControl fullWidth>
        <InputLabel id="demo-simple-select-label">Age</InputLabel>
        <Select
          labelId="demo-simple-select-label"
          id="demo-simple-select"
          value={age}
          label="Age"
          onChange={handleChange}
          IconComponent={() => <div className="test">{newIcon}</div>}
        >
          <MenuItem value={10}>Ten</MenuItem>
          <MenuItem value={20}>Twenty</MenuItem>
          <MenuItem value={30}>Thirty</MenuItem>
        </Select>
      </FormControl>

我还try 手动超速 Select iconOpen类,以获得180度的图标变换和旋转(如本例中的React JS Material UI Select IconComponent (Dropdown Icon) avoid rotating度) 但它也没有起作用.

有人知道为什么新图标不旋转,以及如何解决这个问题,以及在点击新图标时打开菜单吗?

这里是演示:https://codesandbox.io/s/basicselect-material-demo-forked-d946k1?file=/demo.js

推荐答案

您指定的图标组件(() => <div className="test">{newIcon}</div>)会忽略传递给它的所有props .这意味着它不会收到任何MUItry 应用到它的样式.

当 Select 打开(通过transform: 'rotate(180deg)')时,MUI应用的样式控制rotating the icon,也会导致clicks to bypass the icon,并在下面的 Select 上起作用(通过pointerEvents: 'none').

您可以通过定义图标组件,将其接收的props 扩散到<svg>元素上,来解决这个问题:

const NewIcon = (props) => (
  <svg
    {...props}
    width="38"
    height="38"
    viewBox="0 0 38 38"
    fill="none"
    xmlns="http://www.w3.org/2000/svg"
  >
    <rect x="0.5" y="0.5" width="37" height="37" rx="9.5" stroke="#222426" />

    <svg
      width="18"
      height="12"
      x="10"
      y="13"
      viewBox="0 0 18 12"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
    >
      <path
        d="M0.66732 0.999999L8.72964 10.8681C8.76363 10.9095 8.80536 10.9428 8.85208 10.9655C8.89879 10.9882 8.94943 11 9.00065 11C9.05187 11 9.10251 10.9882 9.14922 10.9655C9.19594 10.9428 9.23767 10.9095 9.27167 10.8681L17.334 1"
        stroke="#222426"
        stroke-linecap="round"
        stroke-linejoin="round"
      />
    </svg>
  </svg>
);

然后将其指定为IconComponent={NewIcon},无需进一步包装.

以下是您的Sandbox 的修改版本:

import * as React from "react";
import Box from "@mui/material/Box";
import InputLabel from "@mui/material/InputLabel";
import MenuItem from "@mui/material/MenuItem";
import FormControl from "@mui/material/FormControl";
import Select from "@mui/material/Select";

const NewIcon = (props) => (
  <svg
    {...props}
    width="38"
    height="38"
    viewBox="0 0 38 38"
    fill="none"
    xmlns="http://www.w3.org/2000/svg"
  >
    <rect x="0.5" y="0.5" width="37" height="37" rx="9.5" stroke="#222426" />

    <svg
      width="18"
      height="12"
      x="10"
      y="13"
      viewBox="0 0 18 12"
      fill="none"
      xmlns="http://www.w3.org/2000/svg"
    >
      <path
        d="M0.66732 0.999999L8.72964 10.8681C8.76363 10.9095 8.80536 10.9428 8.85208 10.9655C8.89879 10.9882 8.94943 11 9.00065 11C9.05187 11 9.10251 10.9882 9.14922 10.9655C9.19594 10.9428 9.23767 10.9095 9.27167 10.8681L17.334 1"
        stroke="#222426"
        stroke-linecap="round"
        stroke-linejoin="round"
      />
    </svg>
  </svg>
);

export default function BasicSelect() {
  const [age, setAge] = React.useState("");

  const handleChange = (event) => {
    setAge(event.target.value);
  };

  return (
    <Box sx={{ minWidth: 120 }}>
      <FormControl fullWidth>
        <InputLabel id="demo-simple-select-label">Age</InputLabel>
        <Select
          labelId="demo-simple-select-label"
          id="demo-simple-select"
          value={age}
          label="Age"
          sx={{ "& .MuiSelect-icon": { top: 10 } }}
          onChange={handleChange}
          IconComponent={NewIcon}
        >
          <MenuItem value={10}>Ten</MenuItem>
          <MenuItem value={20}>Twenty</MenuItem>
          <MenuItem value={30}>Thirty</MenuItem>
        </Select>
      </FormControl>
    </Box>
  );
}

Edit BasicSelect Material Demo (forked)

Javascript相关问答推荐

如何编辑代码FlipDown.js倒计时?

如何在NightWatch.js测试中允许浏览器权限?

如何判断属于多个元素的属性是否具有多个值之一

Javascript,部分重排序数组

通过嵌套模型对象进行Mongoose搜索

从WooCommerce Checkout Country字段重新排序国家,保持国家同步

数字时钟在JavaScript中不动态更新

如何在Vue 3中创建自定义 Select 组件,并将选项作为HTML而不是props 传递?

优化Google Sheet脚本以将下拉菜单和公式添加到多行

使用POST请求时,Req.Body为空

类构造函数不能在没有用With Router包装的情况下调用

有条件重定向到移动子域

如何在FastAPI中为通过file:/URL加载的本地HTML文件启用CORS?

如何根据输入数量正确显示alert ?

如何使用抽屉屏幕及其子屏幕/组件的上下文?

本地损坏的Java脚本

设置复选框根据选中状态输入选中值

如何用react组件替换dom元素?

Reaction-在同一页内滚动导航(下拉菜单)

在ReactJS上挂载组件时获得多个身份验证请求