コーディングで困っていることがあって、そういやこのブログの読者に何人か僕よりできそうなプログラマがいそうだな、と思って書いてみる。現場の人間に質問したんだけど簡単に解決できそうな方法はパッと出てこなさそうで、それ以上は僕の仕事放棄につながっちゃうのでどうにもならんのだ。
■やりたいこと
シンプルにこれなんだな。
この記事はver3だけど仕事で導入しているver5でも同じことができる。じゃあ解決じゃんって思うかもしれんが、Bootstarp5のレガシーはreact/typscriptと相性が悪くて、特に<a href="#">に依存しているデザインがダメ。最近のちゃんとした書き方のお作法だと、href内にはURLを入れないとESlintが怒ってくる。つまりこの記事の方法をコピペするだけで解決できない。
Bootstrap側も理解しているのか、react-bootstrapというソリューションがあるが、これまた中途半端な感じでかゆいところに手が届かない。もしかしたら読者の中に簡単にできる方法を知ってるかもしれないということで書いてみた。
■react-bootstrapでダメだったコード
とりあえずドロップダウンは用意されているけど、多重構造に対応していない。
import React from 'react';
import { Dropdown, NavDropdown } from 'react-bootstrap';
export default function View() {
return (
<div className="mt-2">
<NavDropdown title="TEST">
<Dropdown drop="end">
<Dropdown.Toggle variant="Light">
HOGE
<Dropdown.Menu>
<Dropdown.Item href="/test/hoge/user">User</Dropdown.Item>
{/* todo 多重構造はうまくいなかい*/}
<Dropdown.Toggle variant="Light">
HOGE2
<Dropdown.Menu>
<Dropdown.Item href="/test/hoge2/admin">
Admin
</Dropdown.Item>
</Dropdown.Menu>
</Dropdown.Toggle>
</Dropdown.Menu>
</Dropdown.Toggle>
</Dropdown>
</NavDropdown>
</div>
);
}
React-Bootstrap · React-Bootstrap Documentation
公式で用意されているのは2重構造までで、3つ4つと増やしていくことができない。上のコードみたいに無理やりDropdown.Toggleを2重にしたところで、全く同じクラスがあると認識されて表示がおかしくなる。
■解決条件
・ESlintのhref="#"禁止のruleをoffにすると解決に見えるが、rule offが許されていない
・react-bootstrapとbootstrap5のみでなるべく実現したいという方針
・最悪、component内の独自CSSは書いていいよってことになっている
(明日の朝までに解決できなければbootstrapは利用せずCSS書くさ)
そんなわけでね、ちょろいやり方があったらコメントで教えてクレメンス🙏🙏
reactにMaterial UIだのChakra UIだのが人気なのは、jquery時代に通用したcss FWが時代遅れになっちゃってるからなんだなあ、と実感
リプレイス元がbootstrapの古いやつだから採用したけれど、自分にreactの実力があったら政治力で捨てることができたんだろうね