首先先 配置好插件
imagesloaded 网址:https://segmentfault.com/a/1190000007316974 react-lazyload 网址:https://www.npmjs.com/package/react-lazyload react-infinite-scroller 网址:https://www.npmjs.com/package/react-infinite-scroller
下面列出他的一些常用属性
// columnWidth: 200,
// itemSelector: '.grid-item' // 要布局的网格元素
// gutter: 10 // 网格间水平方向边距,垂直方向边距使用css的margin-bottom设置
// percentPosition: true // 使用columnWidth对应元素的百分比尺寸
// stamp:'.grid-stamp' // 网格中的固定元素,不会因重新布局改变位置,移动元素填充到固定元素下方
// fitWidth: true // 设置网格容器宽度等于网格宽度,这样配合css的auto margin实现居中显示
// originLeft: true // 默认true网格左对齐,设为false变为右对齐
// originTop: true // 默认true网格对齐顶部,设为false对齐底部
// containerStyle: { position: 'relative' } // 设置容器样式
// transitionDuration: '0.8s' // 改变位置或变为显示后,重布局变换的持续时间,时间格式为css的时间格式
// stagger: '0.03s' // 重布局时网格并不是一起变换的,排在后面的网格比前一个延迟开始,该项设置延迟时间
// resize: false // 改变窗口大小将不会影响布局
// initLayout: true // 初始化布局,设未true可手动初试化布局
注意: 里面有个这属性 hasMore, 判断后台数据,如果为最后一条了。把他设置成false, 不再监听滚动条。让他不再请求数据。
import React, { Component } from 'react'
import Masonry from 'masonry-layout' //实现瀑布流
import imagesloaded from 'imagesloaded' //监听图片加载
import InfiniteScroll from 'react-infinite-scroller' //下拉加载
import axios from 'axios'
import './styles.less'
const arr = [
'https://dss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3008142408,2229729459&fm=26&gp=0.jpg',
'https://dss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3437217665,1564280326&fm=26&gp=0.jpg',
'https://dss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=2458227883,4095122505&fm=26&gp=0.jpg',
'https://dss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1761250919,1896060533&fm=26&gp=0.jpg',
'https://dss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2852083094,372235004&fm=26&gp=0.jpg',
'https://dss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2944705163,3932100810&fm=26&gp=0.jpg',
'https://dss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3104686528,572431609&fm=26&gp=0.jpg',
]
export default class Pinterest extends Component {
state = {
data: arr,
hasMore: true, // 是否开启下拉加载
}
componentDidMount () {
// this.loadMoreData()
this.imagesOnload()
}
//图片懒加载
imagesOnload = () => {
const elLoad = imagesloaded('.pages_hoc') //获取下拉加载里面的第一个盒子
//always 图片已全部加载,或被确认加载失败
elLoad.on('always', () => {
// 调用瀑布流
this.advanceWidth()
})
}
//瀑布流
advanceWidth = () => {
var elem = document.querySelector('.pages_hoc');
new Masonry( elem, {
itemSelector: '.imgBox', //要布局的网格元素
columnWidth: '.imgBox', //自适应
fitWidth: true, // 设置网格容器宽度等于网格宽度
gutter: 20,
});
}
// 下拉加载
loadMoreData = () => {
const { data } = this.state
axios.post('https://blogs.zdldove.top/Home/Apis/listWithPage')
.then(res => {
console.log(res)
this.setState({
data: [...data, ...arr] //拼接每次加载的数据 arr是我自定义的数据
}, () => {
this.imagesOnload() // 每次获取完数据 触发
})
})
}
render() {
const { data, hasMore } = this.state
return (
<div className='pages_pinterest'>
{/* 下拉加载 */}
<InfiniteScroll
initialLoad={false} // 不让它进入直接加载
// pageStart={1} // 设置初始化请求的页数
loadMore={this.loadMoreData} // 监听的ajax请求
hasMore={hasMore} // 是否继续监听滚动事件 true 监听 | false 不再监听
useWindow={false} // 不监听 window 滚动条
>
<div className="pages_hoc">
{
data.map((item, index) => {
return (
<div key={index} className='imgBox'>
<img src={item} />
</div>
)
})
}
</div>
</InfiniteScroll>
</div>
)
}
}
.pages_pinterest{
width: 99%;
height: 100%;
border: 2px solid red;
overflow: hidden;
overflow: auto;
box-sizing: border-box;
.pages_hoc{
height: 100%;
margin: 0 auto;
.imgBox{
width: 400px;
border: 2px solid red;
margin-bottom: 20px;
img{
vertical-align: top;
}
}
}
}
浙公网安备 33010602011771号