[解決済み] Material-UIの選択項目がselectedValueに置き換わる。
2022-03-07 01:23:57
質問
ごきげんよう。
私はReactでいくつかのMaterial-UIコンポーネントを使用したコードに取り組んでいます。私は現在、MenuItemの子を持つSelectコンポーネントを持っています。選択コンポーネントのオプションは、名前を持つ異なるdivです。私が望むのは、Select コンポーネントをレンダリングし、値が選択されると、その値の div がレンダリングされ、Select コンポーネントが置き換えられることです。
以下は、Selectコンポーネントのオプションです。
const test_options = [
{
name: "DIV 1",
div: (
<div style={{ backgroundColor: "red", height: 50, width: 100 }}>
Div 1
</div>
),
},
{
name: "DIV 2",
div: (
<div style={{ backgroundColor: "blue", height: 50, width: 100 }}>
Div2
</div>
),
},
];
Dropdown/Selectコンポーネントを紹介します。
function Dropdown() {
return (
<FormControl variant="outlined">
<InputLabel id="demo-simple-select-outlined-label">
Select a div
</InputLabel>
<Select
labelId="demo-simple-select-outlined-label"
id="demo-simple-select-outlined"
value={test_options.name}
key={test_options.name}
label="Select a div"
>
<MenuItem value="">
<em>None</em>
</MenuItem>
{test_options.map((options) => (
<MenuItem
button
key={options.name}
value={options.name}
>
{options.div}
</MenuItem>
))}
</Select>
</FormControl>
);
}
ということで、ドロップダウンに
options.name
をテキストとして使用し、オプションが選択されたときにドロップダウンを選択したものに置き換えるようにしたい。
options.div
. つまり、ドロップダウンは値が選択されると消えて、その値の div に置き換えられるのです。
ここで、すべてのコードをまとめてみました。
import React from "react";
import InputLabel from "@material-ui/core/InputLabel";
import MenuItem from "@material-ui/core/MenuItem";
import FormControl from "@material-ui/core/FormControl";
import Select from "@material-ui/core/Select";
export default function DropdownTest() {
const test_options = [
{
name: "DIV 1",
div: (
<div style={{ backgroundColor: "red", height: 50, width: 100 }}>
Div 1
</div>
),
},
{
name: "DIV 2",
div: (
<div style={{ backgroundColor: "blue", height: 50, width: 100 }}>
Div 2
</div>
),
},
];
function Dropdown() {
return (
<FormControl variant="outlined" style={{ width: 200 }}>
<InputLabel id="demo-simple-select-outlined-label">
Select a div
</InputLabel>
<Select
labelId="demo-simple-select-outlined-label"
id="demo-simple-select-outlined"
value={test_options.name}
key={test_options.name}
label="Select a div"
>
<MenuItem value="">
<em>None</em>
</MenuItem>
{test_options.map((options) => (
<MenuItem button key={options.name} value={options.name}>
{options.div}
</MenuItem>
))}
</Select>
</FormControl>
);
}
return <Dropdown></Dropdown>;
}
解決方法は?
なんとか解決しました。ドロップダウンのオプションがクリックされると、選択されたdivに置き換えられます。
import React, { useState } from "react";
import InputLabel from "@material-ui/core/InputLabel";
import MenuItem from "@material-ui/core/MenuItem";
import FormControl from "@material-ui/core/FormControl";
import Select from "@material-ui/core/Select";
export default function DropdownTest() {
const test_options = [
{
name: "DIV 1",
div: (
<div style={{ backgroundColor: "red", height: 50, width: 100 }}>
Div 1
</div>
),
},
{
name: "DIV 2",
div: (
<div style={{ backgroundColor: "blue", height: 50, width: 100 }}>
Div 2
</div>
),
},
];
function Dropdown(props) {
const [value, setState] = useState("None"); // keep track of the current selected dropdown option
console.log("Start value is " + value);
const onOptionChange = (event: React.ChangeEvent<{ value: unknown }>) => {
const chosen_div = test_options.findIndex(
(obj) => obj.name === event.target.value
);
const value = test_options[chosen_div].div;
console.log("Clicked value is " + value);
/// console.log(test_options[1].div);
setState(value); // update state of the current selected value
};
if (value === "None") {
return (
<FormControl variant="outlined" style={{ width: 200 }}>
<InputLabel id="demo-simple-select-outlined-label">
Select a div
</InputLabel>
<Select
labelId="demo-simple-select-outlined-label"
id="demo-simple-select-outlined"
value={value} // Tell material ui select component what the current selected option is.
label="Select a div"
onChange={onOptionChange} // listen for on dropdown menu change
>
<MenuItem value="">
<em>None</em>
</MenuItem>
{props.options.map((options) => (
<MenuItem button key={options.name} value={options.name}>
{options.div}
</MenuItem>
))}
</Select>
</FormControl>
);
} else {
return <div>{value}</div>;
}
}
return <Dropdown options={test_options}></Dropdown>;
}
関連
-
[解決済み] React テキストを挟んだ横長の仕切りを作る
-
[解決済み] error 'document' is not defined : eslint / React
-
[解決済み] マテリアルUIセレクトフィールドのマルチセレクト
-
[解決済み] Webpack + Babelです。プリセット "es2015 "がディレクトリに相対して見つからなかった
-
[解決済み] React + TypeScript のエラーです。この呼び出しにマッチするオーバーロードがありません
-
[解決済み] React-Router 4 キャッチオールルート
-
[解決済み] 非必須項目に対するYupバリデーション
-
[解決済み] React JSでは、状態を直接変異させない、setState() react/no-direct-mutation-stateを使用する。
-
[解決済み] react-router-domを使用する際に「Function components cannot be given refs」を回避する方法は?
-
[解決済み] React Hooksの「exhaustive-deps」lintルールを理解する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プリセットファイルはオブジェクトのエクスポートができない
-
[解決済み] Next.jsでWebSocketを利用する
-
[解決済み] MUI Boxは何のためのコンポーネントですか?
-
[解決済み] Webpack + Babelです。プリセット "es2015 "がディレクトリに相対して見つからなかった
-
[解決済み] TypeError: reactjs の未定義のプロパティ 'status' を読み取ることができません。
-
[解決済み] React-Router 4 キャッチオールルート
-
[解決済み] Uncaught (in promise) Error: リクエストに失敗、ステータスコード404
-
[解決済み] Static HTML elements with event handlers require a role." を修正するにはどうすればよいですか?
-
[解決済み] React Hooksの「exhaustive-deps」lintルールを理解する
-
[解決済み] React」は定義される前に使用されていた