🐜

Ant DesignのButtonコンポーネントの文字列の間に謎のスペースが入る話とその解決策

2021/10/29に公開

結論

それはバグではなく。仕様です。
適切なpropsを与えて解除できます。

https://ant.design/components/button/#FAQ

import { ConfigProvider } from 'antd'

<ConfigProvider autoInsertSpaceInButton={false}>
    {children}
</ConfigProvider>

参考

Ant Design - GitHub
Ant Design Button - Github.dev

解説

コードを追いながら簡易ログ的に書きました。
雑なのは許してください。

関連file
./components/button/button.tsx
./components/button/style/index.less

挿入を必要とするフラグ

下記のコードの部分を見ると、childrenが1つで、iconが無く、ボーダーの枠線のtypeの指定の場合、「なにか」を挿入するフラグがtrueになるみたいです。

漢字2文字を判定して「なにか」のフラグstateをtrueにする

「先程の挿入するフラグ」と「漢字2文字」を判定する正規表現のフラグがtrueであれば、また別の「なにか」のフラグのReact Stateをtrueにセットします。

classNameを見る

buttonに適用されるclassNameが下記です。
なるほど、先程のhasTwoCNCharだけではフラグは足りない見たいですね。

余談ですが、hasTwoCNCharって"has two Chinese character"の略ですかね?

buttonに適用されるStyle

./components/button/style/index.lessのファイルのcssを見てみましょう。

letter-spacingが適用されているみたいです。
これはspaceじゃ無いですね…。
そもそも今回はcssどころか文字列の半角スペースが入って居たんですよね。

となるとこれじゃないものがあるはず。
https://developer.mozilla.org/ja/docs/Web/CSS/letter-spacing

buttonに渡されるchildrenのkidsを見る

居た!このspaceChildren()が怪しいぞ!
名前からして明らかにspace突っ込んでるのがわかる!

見つけた!spaceを挿入している関数!

spaceChildren()の中でinsertSpace()を呼び出して、その返り値を返却しています。
こいつが原因だったのか…。

じゃあ、spaceをどうやったら消せるの?

今までのコードを読んできた限り、どうやらautoInsertSpacefalseにできたらOKらしい!

しかし、貴様…。一体どこでfalseにできるんだ?



省略!<ConfigProvider />autoInsertSpaceInButtonpropsをfalseにしよう!

なんとアントデザインのButtonコンポーネントのFAQに記載がありました。
https://ant.design/components/button/#FAQ

上記の後、コードを追っていくとConfigContextautoInsertSpaceInButtonfalseにしろと言われて、下記のリンクにたどり着きました。

propsに普通にあるやん。

https://ant.design/components/config-provider/#API

import { ConfigProvider } from 'antd'

<ConfigProvider autoInsertSpaceInButton={false}>
    {children}
</ConfigProvider>

まとめ

OSSのコードを読むのは面白い!
ただ、後で「ドキュメントに書いてあったんかーい!!」となることも多いので、公式ドキュメントはしっかり読もう!

Discussion