在NextJs中动态应用时,TailwindCSS样式未呈现

z0qdvdin  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(435)

为了使用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代码,但是静态版本的代码无法解决这个问题(当使用颜色变量时)。
谢谢你的帮助。

6jjcrrmo

6jjcrrmo1#

这是tailwindcss和动态类的一个已知问题,因为类是在渲染之后应用的,所以tailwind不会生成其效果,除非中有另一个元素与静态类具有相同的类。
因此,你可以使用tailwind“safelist”来解决这个问题,在你的tailwind.config中,定义一个包含所有tailwind类的safelist数组,这些类是你需要生成的,并且在你的代码中不作为静态类存在。
tailwind.config.js:

module.exports = {
  content: [
    './pages/**/*.{html,js}',
    './components/**/*.{html,js}',
  ],
  safelist: [
    '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',
  ]
  // ...
}

现在,这些类总是会生成的,所以当你动态地应用它们时,它们会相应地改变。
请注意,添加到安全列表后需要重新启动服务器。
来源
另一个手动解决方案是创建一个隐藏元素,并向其中添加所有需要的类,这样即使在渲染后动态获取它们,也会生成这些类

<div className="hidden from-red-500"></div>

但我觉得安全列表更好

相关问题