React实现二级联动(左右联动)

 更新时间:2021年09月10日 10:34:23   作者:小周同学:  
这篇文章主要为大家详细介绍了React实现二级联动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了React实现二级联动的具体代码,供大家参考,具体内容如下

js代码

import { Component } from 'react'
import './linkage.less'

class Linkage extends Component {
    constructor(...args) {
        super(...args)

        // 添加左侧
        this.FnButtonList = []
        //添加右侧
        this.FnContentList = []
        // 开关
        this.ScrollBys = true
        // 在constructor中直接执行——>react更新时才会渲染——>componentDidMount时才能触发获取
        this.init()

    }
    init() {
        this.FnSetButton(20)
        // 右侧的渲染
        this.FnSetContent(20)
        this.state = {
            ButtonList: this.FnButtonList,
            ContentList: this.FnContentList,
            // 下标
            ButtonListIndex: 0,
        }


    }
    componentDidMount() {
        this.EveryHeight = this.refs['linkage-button-list'].children[0].offsetHeight
    }
    // 随机数
    FnSetRandom(m, n) {
        return parseInt(Math.random() * (m - n) + n);
    }
    // 渲染左侧的按钮
    FnSetButton(n) {
        for (var i = 0; i < n; i++) {
            this.FnButtonList.push({
                id: `按钮${i}`,
                text: `按钮${i}`
            })
        }
    }

    // 渲染右侧内容
    FnSetContent(n) {
        let ContTop = 0;//第一个元素距离页面顶部的距离
        let Random = this.FnSetRandom(750, 1400)
        for (let i = 0; i < n; i++) {
            this.FnContentList.push({
                height: Random,
                id: `内容${i}`,
                text: `内容${i}`,
                top: ContTop,
            });
            ContTop += Random;
        }
    }

    Fncurrn(index) {
        if (index > 3) {
            this.refs["linkage-button"].scrollTop = (index - 3) * this.EveryHeight;

        }
        if (index <= 3) {
            this.refs["linkage-button"].scrollTop = 0;
        }
    }
    // 点击
    FnButtonTab(index) {
        this.ScrollBys = false
        this.setState({
            ButtonListIndex: index
        })
        this.refs["linkage-content"].scrollTop = this.state.ContentList[index].top;

        //点击居中
        this.Fncurrn(index)
    }

    //右边滚动左边
    FnScroll(ev) {
        this.ContTop = ev.target.scrollTop
        if (this.ScrollBys) {
            let n = 0

            for (let i = 0; i < this.state.ContentList.length; i++) {
                if (
                    this.refs["linkage-content"].scrollTop >= this.state.ContentList[i].top
                ) {
                    //盒子滚动的距离如果大于右边盒子里的元素距离页面顶部的距离
                    n = i;
                }
            }
            this.setState({
                ButtonListIndex: n
            })

            if (Math.abs(n - this.state.ButtonListIndex) === 1) {

                this.setState({
                    ButtonListIndex: n
                })
                //滚动居中

                this.Fncurrn(n)

            }
        }


        if (this.ContTop == this.state.ContentList[this.state.ButtonListIndex].top) {
            this.ScrollBys = true
        }

    }

    render() {
        return (
            <div className="linkage">
                <div className="linkage-button" ref="linkage-button">
                    <div className="linkage-button-list" ref="linkage-button-list">
                        {this.state.ButtonList.map((item, index) => <div
                            key={item.id}
                            className={this.state.ButtonListIndex == index ? 'linkage-button-item ac' : 'linkage-button-item'}
                            onClick={this.FnButtonTab.bind(this, index)}
                        >
                            {item.text}
                        </div>)}
                    </div>
                </div>
                <div className="linkage-content" ref="linkage-content" onScroll={this.FnScroll.bind(this)}>
                    <div className="linkage-content-list">
                        {this.state.ContentList.map((item) => <div
                            className="linkage-content-item"
                            key={item.id}
                            style={{ height: item.height + 'px' }}
                        >
                            <div className="linkage-content-title"> {item.text}</div>
                        </div>)}
                    </div >
                </div >
            </div >
        )
    }
}
export default Linkage

css文件

body {
    margin: 0;
  }
  .linkage {
    width: 100vw;
    height: 100vh;
    display: flex;
    .linkage-button {
      width: 20vw;
      height: 100vh;
      background: chocolate;
      text-align: center;
      font-size: 40px;
      color: #fff;
      overflow: scroll;
      scroll-behavior: smooth;
      .linkage-button-list {
        width: 20vw;
        .linkage-button-item.ac {
          background: lightblue;
        }
        .linkage-button-item {
          width: 20vw;
          height: 10vh;
          line-height: 10vh;
        }
      }
    }
    .linkage-content {
      width: 80vw;
      height: 100vh;
      scroll-behavior: smooth;
      overflow: scroll;
      .linkage-content-list {
        .linkage-content-item {
          width: 80vw;
          height: 100vh;
          .linkage-content-title {
            height: 6vh;
            line-height: 6vh;
            width: 80vw;
            text-align: center;
            background: chartreuse;
            color: #fff;
            font-size: 30px;
          }
        }
      }
    }
  }
  .linkage-button::-webkit-scrollbar {
    display: none; /* Chrome Safari */
  }
  .linkage-content::-webkit-scrollbar {
    display: none; /* Chrome Safari */
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • create-react-app修改为多页面支持的方法

    create-react-app修改为多页面支持的方法

    本篇文章主要介绍了create-react-app修改为多页面支持的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • antd form表单如何处理自定义组件

    antd form表单如何处理自定义组件

    这篇文章主要介绍了antd form表单如何处理自定义组件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • React前端DOM常见Hook封装示例上

    React前端DOM常见Hook封装示例上

    这篇文章主要为大家介绍了React前端DOM常见Hook封装示例上篇,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • React用法之高阶组件的用法详解

    React用法之高阶组件的用法详解

    高阶组件也就是我们常说的HOC,是React中用于复用组件逻辑的一种高级技巧。这篇文章主要通过一些示例带大家学习一下高阶组件的使用,希望对大家有所帮助
    2023-04-04
  • React中useState的理解和使用案例

    React中useState的理解和使用案例

    Hook是React16.8的新增特性,它可以让你在不编写class的情况下使用state以及其他的React特性,本文中讲解的useState就是React中的其中一个Hook,这篇文章主要给大家介绍了关于React中useState理解和使用的相关资料,需要的朋友可以参考下
    2024-03-03
  • React大文件分片上传原理及方案

    React大文件分片上传原理及方案

    前端进行大文件分片上传的方案几乎都是利用Blob.prototype.slice方法对文件进行分片,用数组将每一个分片存起来,最后将分片发给后端,本文给大家介绍React大文件分片上传方案,感兴趣的朋友跟随小编一起看看吧
    2023-08-08
  • React中setState更新状态的两种写法

    React中setState更新状态的两种写法

    在 React 中,我们经常需要更新组件的状态(state),使用 setState 方法是一种常见的方式来实现状态的更新,而在使用 setState 方法时,有两种不同的写法,即对象式和函数式,本文将介绍这两种写法的区别和使用场景,需要的朋友可以参考下
    2024-03-03
  • React实现评论的添加和删除

    React实现评论的添加和删除

    这篇文章主要为大家详细介绍了React实现评论的添加和删除,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • React Virtual DOM前端框架全面分析

    React Virtual DOM前端框架全面分析

    这篇文章主要为大家介绍了React Virtual DOM前端框架全面分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • React Native 如何获取不同屏幕的像素密度

    React Native 如何获取不同屏幕的像素密度

    这篇文章主要介绍了 React Native 如何 获取不同屏幕的像素密度的相关资料,需要的朋友可以参考下
    2017-01-01

最新评论