ちょっとハマったので、対応方法をまとめ。
今回は、React のプロジェクトでマテリアルデザインを導入するために利用している「Material-UI」というフレームワークについてです。
このフレームワークで用意されている Lists コンポーネントを使ってリストを作成しているのですが、リストアイテムの右端にアイコンボタンを設置したとき、ボタンを押すとリストアイテムまで反応してしまうという現象が発生していました。
バージョンが古いのも問題なのでしょうが…依存関係の問題もあり、まだアップデートができていません。
時間を見つけて行いたいと思います。
サンプルのコードはこちら。
const rightButton = ( <IconButton onClick={this.clickButton}> <MoreVertIcon color={grey400} /> </IconButton> ); <ListItem onClick={this.listClick} primaryText={[タイトル]} secondaryText={[サブタイトル]} leftAvatar={<img src={[画像URL]} height="40" width="40" style={style.image} />} rightIconButton={rightButton}/>
上記のように、右端に表示したいアイコンボタンを rightIconButton
を使って定義したのですが、このボタンをクリックすると、ListItem
で指定した onClick
も発火してしまいます。
ドキュメントによると、rightIconButton
を使って定義したボタンをクリックした時は、ListItem
のクリックイベントは発火しないと書かれているのですが…。
で、正直面倒くさくなってしまったため、力業で解決することにしました。
それが下記のコードです。
<div className="listItem"> <ListItem onClick={this.listClick} primaryText={[タイトル]} secondaryText={[サブタイトル]} leftAvatar={<img src={[画像URL]} height="40" width="40" style={style.image} />} rightIconButton={rightButton}/> <IconButton onClick={this.clickButton} className="rightButton"> <MoreVertIcon color={grey400} /> </IconButton> </div>
ListItem から IconButton
を外に出してしまい、CSS で位置を調整しました。
なお、CSS は下記のとおりです。
.listItem { position: relative; } .rightButton { position: absolute; right: 6px; top: 50%; transform: translateY(-50%); }
恐らく上記の CSS であれば、ListItem の高さが変わってもボタンの位置は上下中央揃えになるはずです。
なお、CSS はデザインに応じて適宜変更してください。
以上、Material-UI のLists コンポーネントの rightIconButton が思った通りの動作をしなかった時の対処法でした。
正式な方法ではありませんが、少なくとも私の環境では問題なく動作しておりますので、お急ぎの時はこの方法を検討してみてはいかがでしょうか。