千家信息网

React和ts如何实现二级联动效果

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍React和ts如何实现二级联动效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!.tsx文件import { Component, createRef} fr
千家信息网最后更新 2026年11月03日React和ts如何实现二级联动效果

这篇文章主要介绍React和ts如何实现二级联动效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

.tsx文件

import { Component, createRef} from 'react' import './index.less' interface State {  top: any  ButtonList: Button[]  ContentList: Content[]  ButtonIndex: number}interface Button {  id: string  text: string}interface Content {  id: string  text: string  height: number  top: number}interface Props { } class Stairs extends Component{  LeftList: Button[]  RightList: Content[]  kaiguan: boolean  right = createRef()  left = createRef()  LeftTex = createRef()  // oTop: number | undefined  viewHeight: number | undefined  offHeight: number | undefined  Lefttext = createRef()  top: number | undefined  oTop: number | undefined  constructor(props: Props) {    super(props)    this.state = {      ButtonList: [],      ContentList: [],      ButtonIndex: 0,      top: 0    }    this.LeftList = []    this.RightList = []    this.kaiguan = true    this.oTop = 0  }  componentDidMount() {    this.BtnList(20)    this.ConList(20)    this.setState({      ButtonList: this.LeftList,      ContentList: this.RightList    })  }  getRandom(m: number, n: number): number {    return parseInt(`${Math.random() * (m - n) + n}`);  }  BtnList(n: number) {    for (let i = 0; i < n; i++) {      this.LeftList.push({        id: `a${i}`,        text: `按钮${i}`,      });    }  }  ConList(n: number) {    let ConTop = 0;    for (let i = 0; i < n; i++) {      let RandomHeight = this.getRandom(736, 1400);      this.RightList.push({        id: `b${i}`,        text: `标题${i}`,        height: RandomHeight,        top: ConTop,      });      ConTop += RandomHeight;    }  }  FnScroll() {    // console.log(11)    if (this.right.current) {      this.oTop = this.right.current.scrollTop;      if (this.kaiguan) {        // console.log(111)        let count = 0        for (var i = 0; i < this.state.ContentList.length; i++) {          if (this.oTop >= this.state.ContentList[i].top) {            count = i          }          this.setState({            ButtonIndex: count          })        }        // console.log(ButtonIndex,count)      }    }    // eslint-disable-next-line    if (this.oTop == this.state.ContentList[this.state.ButtonIndex].top) {      this.kaiguan = true;    }  }  Fn(index: any, ev: React.MouseEvent) {    this.viewHeight = document.documentElement.clientHeight / 2    let target = ev.target as HTMLDivElement    this.offHeight = target.offsetTop    // console.log(this.offHeight)    if (this.offHeight > this.viewHeight) {      if (this.LeftTex.current) {        this.LeftTex.current.scrollTo({          top: this.offHeight - this.viewHeight - target.clientHeight / 2,          behavior: "smooth",        })      }      // console.log(this.LeftTex.current)    }    // console.log(this.offHeight - this.viewHeight - target.clientHeight / 2)    this.kaiguan = false;    // this.offHeight = ev.target.offsetTop    // console.log(ev.target)    if (this.right.current) {      this.right.current.scroll({        top: this.RightList[index].top,        behavior: "smooth",      });    }    this.setState({      ButtonIndex: index    })  }  ButtonIndex(index: number) {    if (index >= 3) {      if (this.left.current && this.Lefttext.current) {        this.left.current.scrollTop = (index - 3) * this.Lefttext.current.offsetHeight;      }    }    if (index < 3) {      if (this.left.current) {        this.left.current.scrollTop = 0;      }    }    this.setState({      ButtonIndex: index    })  }   render() {    let footList = this.state.ButtonList    return (      
{footList.map((item, index) =>
{item.text}
)}
{this.state.ContentList.map((item) =>
{item.text}
)}
) } } export default Stairs

.less文件

.scroll {  width: 100vw;  height: 100vh;  overflow-y: scroll;   .box1 {    height: 300px;    background: #000;    width: 100%;  }  .box2 {    height: 200px;    background: tomato;    width: 100%;  }  .box3 {    position: -webkit-sticky;    position: sticky;    top: 0;    height: 100px;    background: palevioletred;    z-index: 999;    width: 100%;  }  .scroll-con {    width: 100vw;    height: 100vh;    position: -webkit-sticky;    position: sticky;    top: 100px;    display: flex;    .left,    .right {      height: 100vh;      overflow-y: scroll;    }    .left {      width: 20vw;      .left-txt {        width: 20vw;        height: 100px;        text-align: center;        line-height: 100px;        background: red;      }      .left-txt.ac {        background: lightcoral;        z-index: 999;      }    }    .right {      width: 80vw;        .right-title {        width: 100%;        height: 5vh;        background: darkblue;        color: aqua;        line-height: 5vh;      }    }  }}

最后把自己定义的文件夹添加到路由里即可

效果图如下

以上是"React和ts如何实现二级联动效果"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

效果 文件 内容 篇文章 价值 兴趣 小伙 小伙伴 按钮 效果图 文件夹 更多 标题 知识 行业 资讯 资讯频道 路由 频道 参考 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技赋能下的互联网金融 互联网电商科技 高科技与互联网 合肥互联网科技公司 唐信互联网科技 极限挑战互联网科技 广州互联网络科技有限公司 上海亿帐通互联网科技 安控科技rtu产品工业互联网 互联网系的金融科技公司 开一家科技互联网公司需要多少钱 乌苏新华互联网科技做什么的 深圳艾果互联网通讯科技 工业互联网山东科技大学 山东星卡互联网科技有限公司官网 半导体是互联网高科技吗 美国五大互联网科技公司市值多少 山东蛋芒互联网科技有限公司 北京瑞云互联网科技有限公司 互联网企业和网络科技有限公司 互联网和科技技术 科技互联网政务服务 丰台科技园 互联网 华服互联网科技官网 注册互联网科技公司经营范围大全 互联网科技大奖都有哪些公司 想开互联网科技公司怎么样 长沙茂晟互联网科技有限公司 中和天地互联网科技有限公司 武汉亿视互联网科技有限公司
0