ReactのJSXでクラス名を付ける時に変数と固定値な文字列を一緒に使いたいとき
コレはうまくいかない
return ( <button className="btn btn-${btnState}">BUTTON</button> );
文字列結合する
function Button() { const [btnState, setBtmState] = useState('primary'); return ( <button className={'btn btn-' + btnState}>BUTTON</button> ); }
テンプレート構文 (ES2015)を使う
function Button() { const [btnState, setBtmState] = useState('primary'); return ( <button className={`btn btn-${btnState}`}>BUTTON</button> ); }
変数で複数のクラスにするとき
.error
とか変数があれば複数のクラス名になるような時、ただ結合しただけだと変数が空の時、HTMLのクラス属性の最後に空白ができて少し気持ち悪いです。
これを解決するには単純に trim()
すればOKです。
テンプレート構文 (ES2015)を使う
function Button() { const [btnState, setBtmState] = useState(''); return ( <button className={`btn ${btnState}`.trim()}>BUTTON</button> ); }
配列結合 join()
を使う
function Button() { const [btnState, setBtmState] = useState(''); return ( <button className={['btn', btnState].join(' ').trim()}>BUTTON</button> ); }
最後の空白が気持ち悪いかどうかは、まぁお気持ち的な要素が強いですが、いずれにせよ ``
で囲うテンプレート構文を使うのが一番手っ取り早そうです。
trim()
も標準になってるのでとても楽ですね。存在しないときはStringオブジェクトを拡張して独自実装してた時代が懐かしいです… 戻りたくはない
[参考]
- reactjs - In JSX how do I set a className as string + {prop} - Stack Overflow
- String.prototype.trim() - JavaScript | MDN

- 作者: 藤村大介,森田リーナ,渡邉祐一,市原創,板倉広明,高橋征義,笹田耕一,大原壯太,新倉涼太,末永恭正,久保田祐史,牧大輔,東邦之,星北斗,池田拓司,竹馬光太郎,はまちや2,竹原,八谷賢
- 出版社/メーカー: 技術評論社
- 発売日: 2019/04/25
- メディア: 単行本
- この商品を含むブログを見る