Ant DesignのButtonコンポーネントの文字列の間に謎のスペースが入る話とその解決策
結論
それはバグではなく。仕様です。
適切なpropsを与えて解除できます。
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どころか文字列の半角スペースが入って居たんですよね。
となるとこれじゃないものがあるはず。
buttonに渡されるchildrenのkidsを見る
居た!このspaceChildren()
が怪しいぞ!
名前からして明らかにspace突っ込んでるのがわかる!
見つけた!spaceを挿入している関数!
spaceChildren()
の中でinsertSpace()
を呼び出して、その返り値を返却しています。
こいつが原因だったのか…。
じゃあ、spaceをどうやったら消せるの?
今までのコードを読んできた限り、どうやらautoInsertSpace
をfalse
にできたらOKらしい!
しかし、貴様…。一体どこでfalse
にできるんだ?
<ConfigProvider />
のautoInsertSpaceInButton
propsをfalse
にしよう!
省略!なんとアントデザインのButtonコンポーネントのFAQに記載がありました。
上記の後、コードを追っていくとConfigContext
のautoInsertSpaceInButton
をfalse
にしろと言われて、下記のリンクにたどり着きました。
propsに普通にあるやん。
import { ConfigProvider } from 'antd'
<ConfigProvider autoInsertSpaceInButton={false}>
{children}
</ConfigProvider>
まとめ
OSSのコードを読むのは面白い!
ただ、後で「ドキュメントに書いてあったんかーい!!」となることも多いので、公式ドキュメントはしっかり読もう!
Discussion