1

MenuItemMUI を別のコンポーネントと組み合わせてSelectレンダリングすると、MUI に関する問題が発生します。

コードサンドボックスはこちら

基本的に、私は次のようなものを持っています:

import { Select } from "@material-ui/core";
import CustomMenuItem from "./CustomMenuItem";
import React from "react";

export default function App() {
  const userIds = [1, 2, 3];
  return (
    <Select
      id="user"
      name="User"
      onChange={(event: React.ChangeEvent<{ value: unknown }>) => {
        alert(event.target.value as number);
      }}
    >
      {userIds.map((userId) => (
        <CustomMenuItem key={userId} userId={userId} />
      ))}
    </Select>
  );
}

そして、これはカスタム項目です:

import { MenuItem, Typography } from "@material-ui/core";
import React from "react";

interface CustomMenuItemProps {
  userId: number;
}

const CustomMenuItem = React.forwardRef<HTMLLIElement, CustomMenuItemProps>(
  (props: CustomMenuItemProps, ref) => {
    const { userId, ...rest } = props;
    return (
      <MenuItem value={userId} {...rest} ref={ref}>
        <Typography>{userId}</Typography>
      </MenuItem>
    );
  }
);
export default CustomMenuItem;

最初は ref なしでこれを実行しましたが、コンソールにエラーが表示されたWarning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?ので ( )、しばらくグーグルで調べたところ、この ref を渡す必要があることがわかりました。...restまた、小道具が必要であることを理解しているので、小道具のも渡しMenuItemます。

予想される動作: をクリックするとMenuItem、コンポーネントで選択されSelectます。

実際の動作: 何も起こりません。

問題は、CustomMenuItem再利用可能にするために を作成したことです。しかし、その前に、次のような単純な関数がありました。これは inと in のrenderItem両方で使用し、同じコードで、同じ JSX ツリーを返しました。そして、それはうまくいきましたが、何らかの理由で今はうまくいきません。だから私がするなら:Select.renderValueuserIds.mapCustomMenuItem

    <Select
      id="user"
      name="User"
      onChange={(event: React.ChangeEvent<{ value: unknown }>) => {
        alert(event.target.value as number);
      }}
    >
      {userIds.map((userId) => (
        <MenuItem key={userId} value={userId}>
          <Typography>{userId}</Typography>
        </MenuItem>
      ))}
    </Select>

それは単に動作します:(

ここで何か不足していますか?

4

1 に答える 1