Mon composant ne lit pas le CSS Slick importé

Sep 20 2020

J'importe le CSS du carrousel Sick dans mon composant racine comme ceci:

    import React from 'react'
    import PropTypes from 'prop-types'
    import { ThemeProvider } from 'styled-components'
    import { AppContext } from 'services/AppContext'
    import Layout from 'components/blocks/Layout'
    import { GlobalStyle, AppContainer } from 'shared/styles'
    
    import theme from 'theme'
    
    import 'slick-carousel/slick/slick.css'
    import 'slick-carousel/slick/slick-theme.css'
    
        function App({ Component, pageProps }) {
          return (
            <AppContext.Provider value={{ foo: 'bar' }}>
              <ThemeProvider theme={theme}>
                <AppContainer>
                  <GlobalStyle />
                  <Layout>
                    <Component {...pageProps} />
                  </Layout>
                </AppContainer>
              </ThemeProvider>
            </AppContext.Provider>
          )
        }
        
        App.propTypes = {
          Component: PropTypes.elementType.isRequired,
          pageProps: PropTypes.object.isRequired,
        }
        
        export default App

Le problème est que les styles ne sont pas appliqués à mon carrousel.

J'ai essayé d'importer le CSS dans le composant qui en a besoin, mais next.js me donne l'erreur que je dois soit l'importer dans le composant racine, soit le rendre au niveau du composant CSS, ce que je ne sais pas faire .

Des suggestions s'il vous plaît?

Réponses

1 nghiaht Sep 21 2020 at 08:07

J'ai également rencontré ce problème lors de l'utilisation de react-slick, il nécessite peu de CSS de slick-carrousel pour le curseur, les flèches de navigation ...

Actuellement, j'ai deux solutions:

  • Solution 1 : déplacez l'importation CSS dans root ( pages/_app.js)
// _app.css
...
import 'slick-carousel/slick/slick.css'
import 'slick-carousel/slick/slick-theme.css'
...

// page/_app.js

...
import "./_app.css"
...

Commentaire: Cela permet de réagir avec souplesse, mais le CSS du carrousel est chargé sur toutes les pages. Pas si bon!

  • Solution 2 (préférée) : utilisez la linkbalise et intégrez ces CSS dans votre page<head>
// I downloaded the CSS, minified them and put in the public folder
/public/static/css/slick.css
/public/static/css/slick-theme.css

// page/example.js

import Head from "next/head"

...
<Head>
// Embed local CSS
<link rel="stylesheet" type="text/css" href="/static/css/slick.css" />
<link rel="stylesheet" type="text/css" href="/static/css/slick-theme.css" />

// Or we can change the href to CDNs too
</Head>

Commentaire: Nous intégrons et chargeons uniquement les styles dans les pages dont nous avons besoin, peut-être que cela permet d'économiser des octets.