Comments (12)
Props.className
でfont-semibold
を指定したとき、
- コンポーネントの定義を優先する場合
{/* font-boldが優先される */}
<div className={`${className} font-bold`}>
Props.className
を優先する場合
{/* font-semiboldが優先される */}
<div className={`font-bold ${className}`}>
の二つの選択肢があるけど、でもどっちにしろコンポーネントの定義見ないと使用者は予期せぬ動作を引き起こしてしまうからどうにかしないとヤバくね?
って話で合ってる?
from shikosai32-front.
それも大事じゃないわけではないけど、自分が今回issueを立てた理由は、
Tailwindが出力したCSSコードの中で、コンポーネント内部で指定した.bg-neutral-900
が外部から指定した.bg-success-700
よりもあとに来てしまうと、${className}
の挿入箇所に関わらずスタイルが上書きできなかったから↓
だからコード上で明確に優先順位を指定できるようにしなければいけないんだけど、それをどうやって実現するのか考えてる
from shikosai32-front.
あー普段の実装では気にしてなかったけど、StoryBookで起こった問題かこれ
from shikosai32-front.
${className}
の位置を最後から最初に変更した場合も同様
import type { FC } from 'react';
import { MdAccessibilityNew } from 'react-icons/md';
import { Button, ButtonIcon } from '@/components/Button';
const Index: FC = () => (
<main className="flex min-h-screen w-screen items-center justify-center">
<div className="rounded-3xl bg-gradient-to-br p-8 gradient-primary">
<h1 className="font-branding text-4xl font-bold text-white">Hello OZ at 茨城高専</h1>
<Button className="bg-success-700" type="button">
<ButtonIcon>
<MdAccessibilityNew />
</ButtonIcon>
<i>react-icon</i>を使ったボタン
</Button>
</div>
</main>
);
export default Index;
CSSの詳細度に依る問題だから、やっぱりStorybookの外でも同様だった
from shikosai32-front.
したがって、その優先順位は記述されたCSSがより後に読み込まれたものが優先される。
理解力が足りてなくて申し訳ないが、つまりどうあがいてもコンポーネントの定義のclassName
が優先されるってこと?
from shikosai32-front.
そうなんだよねえ
TailwindがJITで吐き出す順によるから、運良く外部指定のクラスが後に来た時は上書きができる...んだよね、実はさっきまで適切に上書きできてたし
from shikosai32-front.
ひとつごり押し解決策を思いついた。
- 予めコンポーネントで使う
className
をconst className =
で定義しておく。(例:const className = "flex"
) props.className
にclassName
と競合するスタイルがないかを調べる。あればコンフリクトを解決する。className
とprops.className
をmergeする。
from shikosai32-front.
うーん、やっぱ至難の業すぎるのでこれはダメだな。
from shikosai32-front.
その3:
tailwind-override
をclassName
内で使う
.tailwind.config.js
を読み取ってカスタムクラスまで対応してくれるのかが不明- CSSの詳細度の問題をJS/TS側で無理やり対処しているところがすっきりしない
- GitHubのスター数が84で頼りない
これがその案とほぼ同じことをやってるけど、結局props
を受け渡すたびにコンフリクトがないかどうか計算してるからパフォーマンス的にあまりよくない (要検証) と思う
from shikosai32-front.
それを使う or 例えばカラーを外から指定したいだけであれば、color: "red"|"green"|string
みたいなPropsを定義して、bg-${color}
をすればいい。
パフォーマンスについてはそれほど気にしなくてもいいわけではないけど、まぁそれくらいなら...。
from shikosai32-front.
(これを言ってしまうと元も子もないけど、ここまで来ると多分外部からclassName
で指定すること自体アンチパターンな気がする...)
from shikosai32-front.
tailwind-merge
import { twMerge } from 'tailwind-merge' twMerge('px-2 py-1 bg-red hover:bg-dark-red', 'p-3 bg-[#B91C1C]') // → 'hover:bg-dark-red p-3 bg-[#B91C1C]'クラス名に対立(Conflict)する複数のTailwindユーティリティクラスが存在する場合、後ろのものを優先して抜き出してくれる関数
twMerge
を提供するパッケージ。
- キャッシュと遅延計算でパフォーマンスが考慮されている
Optimized for speed
Results get cached by default, so you don't need to worry about wasteful re-renders. The library uses a LRU cache which stores up to 500 different results. > The cache size can be modified or opt-out of by using extendTailwindMerge.
Expensive computations happen upfront so that twMerge calls without a cache hit stay fast.
These computations are called lazily on the first call to twMerge to prevent it from impacting app startup performance if it isn't used initially.
- コンフィグを設定すれば
.tailwind.config.js
に記述したgradient-*
などの独自のクラスにも対応できる- GitHubスター数563と多め
- 直近コミットが16日前
これで解決する方向性でいいかな?
from shikosai32-front.
Related Issues (20)
- `<UserNavigationMenu>`の既ログイン判定に使う情報の参照元をFirebase Authのものに変更する
- Vercelのデプロイ環境(本番、開発用どちらも)でGoogleのログイン機能が使用できない問題を修正する
- `<Layout>`にFirebaseで認証済みでなおかつ登録が済んでいないときにのみ表示されるモーダルを追加する
- `/auth`に直接URLを入力してアクセスしたときにのみ、正しくログイン状態の判定が行われず間違ったリダイレクトがされてしまう問題を修正する。
- 交換履歴ページのリファクタリングとロジックの追加をする
- `<RankShareCard>`で自身のランキングの集計に使われたポイントを表示できるようにする
- サーバー側での`authId`の追加に追随して`CreateUser`等を修正する
- `useCurrentUserAuthenticationStatusUseCase`で読み込み中はundefinedを返すようにする
- `useCheckUserExistanceUseCase`で送る確認用クエリの`where`で`id`ではなく`authId`を送るようにする
- `/games/*`で使われるゲームの参加状態を変えるときに呼び出されるイベントハンドラ`onAttendanceChangeHandler`の内部で、`ExitGame`と`JoinGame`の呼び出される条件が逆になっている問題を修正する
- `createUser`が複数回送られてしまう問題を修正する
- GraphQLに含まれる`User`の`id`フィールドを`authId`にすべて置き換える
- Profileの作成
- Profileの修正
- ゲーム個別ページで参加退出ボタンの状態が正しく更新されない問題を修正する
- `<LiveCharacter>`の大きさを修正する
- `<Loading>`のデザインに画像を追加する。
- `/index`で使用している`<TemporalIndex>`の文章を本番用に書き換える
- ランキングで選択されている日時の初期値を現在の日付に基づいて解決するようにする
- `/gifts`と`/ranking`にISR機能を追加する
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from shikosai32-front.