• react 瀑布流


    首先先 配置好插件
    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{
       99%;
      height: 100%;
      border: 2px solid red;
      overflow: hidden;
      overflow: auto;
      box-sizing: border-box;
      .pages_hoc{
        height: 100%;
        margin: 0 auto;
        .imgBox{
           400px;
          border: 2px solid red;
          margin-bottom: 20px;
          img{
            vertical-align: top;
          }
        }
      }
    }
    

      

     

  • 相关阅读:
    WPF RichTextbox
    XLT格式化XML那点事(C#代码中的问题解决)(二)
    XML通过XSL格式化的那点事(XML到自定义节点折叠显示)
    C# XML技术总结之XDocument 和XmlDocument
    VS2013问题与解决方法
    Win10 通过升级安装完成后出现了中文字体忽大忽小的问题解决。
    工作这些年对技术学习过程的一些 总结 与 感悟
    C#性能优化考虑的几个方向
    Sql server2012 常见异常处理
    WPF -Enum的三种绑定方法
  • 原文地址:https://www.cnblogs.com/yetiezhu/p/12973499.html
Copyright © 2020-2023  润新知