为了使用TailwindCSS设置背景封面,我从useEffect中的bookId(10位数)中提取了颜色。颜色会更新,组件会使用更新后的颜色值重新呈现,但呈现页面上的背景颜色仍然与其父div相同。
const colors = [
'from-red-500',
'from-orange-500',
'from-yellow-500',
'from-green-500',
'from-cyan-500',
'from-blue-500',
'from-indigo-500',
'from-violet-500',
'from-purple-500',
'from-pink-500',
]
function BgCover(props) {
const [color, setColor] = useState(null)
const router = useRouter()
useEffect(() => {
const id = router.query.bookId
const index = id.slice(-1) //extract the index from bookId
const bgColor = colors[index]
setColor(bgColor)
}, [])
return (
<Fragment>
{color ? (
<div className='flex-grow scrollbar-hide select-none relative'>
<div className={`bg-gradient-to-b ${color} to-black`}>
<section
className={`flex flex-col md:flex-row items-center justify-center p-4`}>
{props.children}
</section>
</div>
</div>
) : (
<p className='text-2xl'>Loading..</p>
)}
</Fragment>
)
}
但是当我用一个颜色值替换颜色变量(比如说'from-red-500')时,背景色在呈现的页面中是可见的。
我也尝试过用getStaticProps替换useEffect中的setColor代码,但是静态版本的代码无法解决这个问题(当使用颜色变量时)。
谢谢你的帮助。
1条答案
按热度按时间6jjcrrmo1#
这是tailwindcss和动态类的一个已知问题,因为类是在渲染之后应用的,所以tailwind不会生成其效果,除非中有另一个元素与静态类具有相同的类。
因此,你可以使用tailwind“safelist”来解决这个问题,在你的tailwind.config中,定义一个包含所有tailwind类的safelist数组,这些类是你需要生成的,并且在你的代码中不作为静态类存在。
tailwind.config.js:
现在,这些类总是会生成的,所以当你动态地应用它们时,它们会相应地改变。
请注意,添加到安全列表后需要重新启动服务器。
来源
另一个手动解决方案是创建一个隐藏元素,并向其中添加所有需要的类,这样即使在渲染后动态获取它们,也会生成这些类
但我觉得安全列表更好