React實現(xiàn)二級聯(lián)動(左右聯(lián)動)
更新時間:2021年09月10日 10:34:23 作者:小周同學:
這篇文章主要為大家詳細介紹了React實現(xiàn)二級聯(lián)動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了React實現(xiàn)二級聯(lián)動的具體代碼,供大家參考,具體內(nèi)容如下
js代碼
import { Component } from 'react' import './linkage.less' class Linkage extends Component { constructor(...args) { super(...args) // 添加左側(cè) this.FnButtonList = [] //添加右側(cè) this.FnContentList = [] // 開關(guān) this.ScrollBys = true // 在constructor中直接執(zhí)行——>react更新時才會渲染——>componentDidMount時才能觸發(fā)獲取 this.init() } init() { this.FnSetButton(20) // 右側(cè)的渲染 this.FnSetContent(20) this.state = { ButtonList: this.FnButtonList, ContentList: this.FnContentList, // 下標 ButtonListIndex: 0, } } componentDidMount() { this.EveryHeight = this.refs['linkage-button-list'].children[0].offsetHeight } // 隨機數(shù) FnSetRandom(m, n) { return parseInt(Math.random() * (m - n) + n); } // 渲染左側(cè)的按鈕 FnSetButton(n) { for (var i = 0; i < n; i++) { this.FnButtonList.push({ id: `按鈕${i}`, text: `按鈕${i}` }) } } // 渲染右側(cè)內(nè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: `內(nèi)容${i}`, text: `內(nèi)容${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 */ }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。