gpt4 book ai didi

next.js - 使用 Next.js 进行 masonry 布局

转载 作者:行者123 更新时间:2023-12-04 17:33:14 24 4
gpt4 key购买 nike

我正在开发一个多页网站,前端使用 Next.js,后端使用 Strapi。在博客页面上,数据是从数据库动态获取的。我正在尝试使用 Masonry 以自适应布局显示这些数据。

我遇到的问题是,在第一次加载时,页面在单个垂直列中显示每个网格项。重新加载时, masonry 布局会生效,但有一些重叠的项目。在第二次重新加载时,所有内容都会正确显示,甚至可以响应。但是,如果我离开页面并返回,它会回到第一个页面。

这是博客页面的代码:

import React from 'react';
import Layout from '../components/StaticLayout';
import Link from 'next/link';
import fetch from 'isomorphic-unfetch';
import '../../static/styles.min.css';

let Masonry = '';

export default class Blog extends React.Component {
constructor(props) {
super(props);
this.state = {
appIsMounted: false
}
}

static async getInitialProps() {
const res = await fetch('http://localhost:1337/blogposts');
const data = await res.json();

return {
posts: data
};
}

async componentDidMount() {
let masonry = await import('masonry-layout');
this.setState({
appIsMounted: true
})
}

render() {
return (
<Layout>
<h1 className="blogHeader">Blog</h1>
{this.state.appIsMounted ? (
<div className="grid js-masonry" data-masonry-options='{ "itemSelector": ".grid-item", "columnWidth": 400 }'>
{this.props.posts.map(
post => (
<div key={post.id} className="grid-item">
<Link href="/p/[id]" as={`/p/${post.id}`}>
<img src={`http://localhost:1337${post.Image.url}`} alt={post.Image.name} className="postImage" />
</Link>
<div className="text">
<Link href="/p/[id]" as={`/p/${post.id}`}>
<a className="postLink">{post.Title}</a>
</Link>
<p className="blurb">{post.Content.substring(0, 300) + '...'}</p>
<Link href="/p/[id]" as={`/p/${post.id}`}>
<button className="viewPost">Read More!</button>
</Link>
</div>
</div>
)
)}
</div>
) : null}
</Layout>
)
}
}

需要注意的是,StaticLayout 脚本仅确保页眉位于每个页面的顶部。

编辑

所以我已经解决了问题的重叠部分。我没有在 html 中初始化 Masonry,而是在“./static”中添加了一个 js 文件。在我的博客页面上,我添加了以下内容:
import Head from 'next/head'

...

return(
<Head>
<script type="text/javascript" src="/static/runMasonry.js"></script>
</Head>
...
)

runMasonry.js 文件如下所示:
window.onload = function () {
var elem = document.querySelector('.grid');
var msnry = new Masonry(elem, {
// options
itemSelector: '.grid-item',
columnWidth: 160,
gutter: 20
});
}

但是当我第一次到达页面或导航离开并返回时,元素仍然显示在列中并且需要重新加载。

最佳答案

想出了一个不理想的修复方法,但它有效。

将以下代码添加到 runMasonry.js 文件中:

window.addEventListener("DOMSubtreeModified", function () {
var elem = document.querySelector('.grid');
if (elem) {
var msnry = new Masonry(elem, {
// options
itemSelector: '.grid-item',
columnWidth: 160,
gutter: 20
});
}
});

因此,它会检测新页面内容何时加载,如果找到我的 .grid 元素,则重新运行 masonry。

如果有人可以提供更好的长期解决方案,请保持开放状态。

关于next.js - 使用 Next.js 进行 masonry 布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57806884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com