通过 CDN 使用 Materialise
正如丹尼尔在他的回答中提到的,您可以在您的自定义中添加 CDN 链接_document
,这样 CSS 和 JavaScript 都可以在浏览器中正确加载。
// /pages/_document.js
class MyDocument extends Document {
render() {
return (
<Html lang="en">
<Head>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css"
/>
</Head>
<body>
<Main />
<NextScript />
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
</body>
</Html>
);
}
}
由于Materialise公司使用Web API的内部,你需要访问连接到该实例Materialise的window
内部useEffect
。这可以防止在ReferenceError: window is not defined
Next.js 在服务器上预渲染页面时出现错误。
这是一个关于如何在呈现轮播的组件中使用 Materialize 的小示例。
const MaterializeCarousel = () => {
useEffect(() => {
const elems = document.querySelectorAll('.carousel');
const instances = window.M.Carousel.init(elems);
}, []);
return (
<div className="carousel">
<a className="carousel-item" href="#one!"><img src="https://lorempixel.com/250/250/nature/1" /></a>
<a className="carousel-item" href="#two!"><img src="https://lorempixel.com/250/250/nature/2" /></a>
<a className="carousel-item" href="#three!"><img src="https://lorempixel.com/250/250/nature/3" /></a>
<a className="carousel-item" href="#four!"><img src="https://lorempixel.com/250/250/nature/4" /></a>
<a className="carousel-item" href="#five!"><img src="https://lorempixel.com/250/250/nature/5" /></a>
</div>
);
};
通过 npm 包使用 Materialize
另一种选择是通过其 npm 包使用库materialize-css
。
您首先需要导入全局 CSS,就像您所做的那样,在_app
.
import 'materialize-css/dist/css/materialize.min.css';
此处无法加载 JavaScript 代码,如前所述,它使用了无法在服务器上运行的 Web API。
相反,以相同的轮播组件为例,您应该materialize-css
在 a 内部动态导入,useEffect
以便它仅在客户端加载。
const MaterializeCarousel = () => {
useEffect(() => {
const init = async () => {
const M = await import('materialize-css');
const elems = document.querySelectorAll('.carousel');
const instances = M.Carousel.init(elems);
};
init();
}, []);
return (
<div className="carousel">
<a className="carousel-item" href="#one!"><img src="https://lorempixel.com/250/250/nature/1" /></a>
<a className="carousel-item" href="#two!"><img src="https://lorempixel.com/250/250/nature/2" /></a>
<a className="carousel-item" href="#three!"><img src="https://lorempixel.com/250/250/nature/3" /></a>
<a className="carousel-item" href="#four!"><img src="https://lorempixel.com/250/250/nature/4" /></a>
<a className="carousel-item" href="#five!"><img src="https://lorempixel.com/250/250/nature/5" /></a>
</div>
);
};