英文:
Trouble with Dynamic Color in Tailwind Component
问题
我遇到了困难,不理解为什么蓝色在我的组件中不起作用。您能帮我在Stack Overflow上解决这个问题吗?我有一个应用不同背景和文本颜色的Tag组件,根据提供的color属性。然而,当我将color属性设置为“blue”时,组件没有应用预期的蓝色。我尝试过各种解决方案,包括动态构建类名和使用Tailwind CSS类的正确语法。然而,我未能解决这个问题。对您提前的任何帮助都将不胜感激!
英文:
I'm having trouble understanding why the blue color is not working in my component. Could you please help me troubleshoot this issue on Stack Overflow? I have a Tag component that should apply different background and text colors based on the color prop provided. However, when I set the color prop to "blue", the expected blue color is not being applied to the component. I have tried various solutions, including dynamically constructing the class names and using the correct syntax for Tailwind CSS classes. However, I have been unsuccessful in resolving the issue. Any guidance or suggestions would be greatly appreciated. Thank you in advance for your assistance!
import React from "react";
export default function Tag({ index, tag, color = "red" }) {
return (
<li
key={index}
className={`inline-flex items-center rounded-full px-3 py-2 text-xs font-bold uppercase bg-${color}-200 text-${color}-700`}
>
<a href={`/?=${tag.text.replace(/\s/g, "_").toLowerCase()}`}>
{tag.text}
</a>
</li>
);
}```
</details>
# 答案1
**得分**: 2
根据[文档](https://tailwindcss.com/docs/content-configuration#dynamic-class-names):
> Tailwind提取类名的最重要影响是它只会在源文件中作为_完整不间断字符串_存在的类名。
>
> 如果您使用字符串插值或连接部分类名在一起,Tailwind将无法找到它们,因此不会生成相应的CSS:
>
> **不要动态构建类名**
>
> ```vue
> <div class="text-{{ error ? 'red' : 'green' }}-600"></div>
> ```
>
> 在上面的示例中,字符串`text-red-600`和`text-green-600`不存在,因此Tailwind不会生成这些类。
> 相反,确保您使用的任何类名都完整存在:
>
> **始终使用完整的类名**
>
> ```vue
> <div class="{{ error ? 'text-red-600' : 'text-green-600' }}"></div>
> ```
您可以:
- 将整个类放在传递给 `className` 的变量中,如下所示:
```jsx
export default function Tag({ index, tag, color = "bg-red-200 text-red-700" }) {
return (
<li
key={index}
className={`… ${color}`}
>
-
为
color
创建一个字典以映射到Tailwind类名,如下所示:export default function Tag({ index, tag, color = "red" }) { const DICTIONARY = { red: 'bg-red-200 text-red-700', // … }; // … return ( <li key={index} className={`… ${DICTIONARY[color]}`} >
-
如果
theme
可以转换为有效的CSS颜色值(或者您可以从Tailwind获取颜色),可以使用style
属性实现真正的动态颜色,如下所示:export default function Tag({ index, tag, color = "red" }) { const styles = { // 从`color`变量转换 }; // … return ( <li key={index} className="…" style={style} >
-
如果您有一组已知的颜色,可以使用
safelist
这些类,示例如下:module.exports = { safelist: [ { pattern: /^text-(red|green|blue)-700$/ }, { pattern: /^bg-(red|green|blue)-200$/ }, // … ], // … };
英文:
As per the documentation:
> The most important implication of how Tailwind extracts class names is that it will only find classes that exist as complete unbroken strings in your source files.
>
> If you use string interpolation or concatenate partial class names together, Tailwind will not find them and therefore will not generate the corresponding CSS:
>
> Don’t construct class names dynamically
>
> vue
> <div class="text-{{ error ? 'red' : 'green' }}-600"></div>
>
> In the example above, the strings text-red-600
and text-green-600
do not exist, so Tailwind will not generate those classes.
> Instead, make sure any class names you’re using exist in full:
>
> Always use complete class names
>
> vue
> <div class="{{ error ? 'text-red-600' : 'text-green-600' }}"></div>
>
You could:
-
Have the entire class in the variable you pass to
className
likeexport default function Tag({ index, tag, color = "bg-red-200 text-red-700" }) { return ( <li key={index} className={`… ${color}`} >
-
Have a dictionary for
color
to Tailwind class names:export default function Tag({ index, tag, color = "red" }) { const DICTIONARY = { red: 'bg-red-200 text-red-700', // … }; // … return ( <li key={index} className={`… ${DICTIONARY[color]}`} >
-
Use the
style
attribute for truly dynamic colors, iftheme
can be converted to a valid CSS color value (or you could get the color from Tailwind):export default function Tag({ index, tag, color = "red" }) { const styles = { // Convert from `color` variable }; // … return ( <li key={index} className="…" style={style} >
-
safelist
the classes, if you have a limited number of known colors:module.exports = { safelist: [ { pattern: /^text-(red|green|blue)-700$/ }, { pattern: /^bg-(red|green|blue)-200$/ }, // … ], // … ];
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论