React實現二級聯動效果(樓梯效果)
阿新 • • 發佈:2021-09-11
本文例項為大家分享了React實現二級聯動效果的具體程式碼,供大家參考,具體內容如下
模仿餓了麼實現一個二級聯動的效果;
import "..//Leftrightlinkage.less"; import React,{ Component } from "react"; export default class Leftrightlinkage extends Component { constructor(...args) { super(...args); this.state = { list: [ { id: 1,title: "列表1" },{ id: 2,title: "列表2" },{ id: 3,title: "列表3" },{ id: 4,title: "列表4" },{ ihttp://www.cppcns.comd: 5,title: "列表5" },{ id: 6,title: "列表6" },{ id: 7,title: "列表7" },{ id: 8,title: "列表8" },{ id: 9,title: "列表9" },{ id: 10,title: "列表10" },],LeftList: [ { id: 1,title: "列表1",height: 600 }, { id: 2,title: "列表2",title: "列表3",title: "列表4",{ id: 5,title: "列表5",title: "列表6",title: "列表7",title: "列表8",title: "列表9",title: "列表10",curr: 0,//儲存下標 }; // 預設新增一個 因為第一個的scrollTop值是0 this.LeftHeight = [0]; // 滾動的開關 this.Swich = true; } // 渲染完成獲取每一個列表距離頂部的距離 componentDidMount() { // 定義為0 每次就可以迴圈加起來就是盒子距離頂部的距離 this.Height = 0; // 迴圈獲取每一個的高 for (var i = 0; i < this.state.LeftList.length - 1; i++) { this.Height += this.state.LeftList[i].height; this.LeftHeight.push(this.Height); } } // 點選左側列表 點選獲取下標 FnTable(index) { // 點選的時候讓右邊的滾動事件為false this.Swich = false; // 儲存下標 this.swww.cppcns.cometState({ curr: index,}); // 根據下標取出陣列中對應下標的scrollTop值 就讓右邊的scrollTop為陣列中取出的值 this.refs["leftItem"].scrollTop = this.LeftHeight[index]; } FnScroll() { // 監聽滾動 this.scrollTop = this.refs["leftItem"].scrollTop; // 這邊用開關判斷是否執行 if (this.Swich) { // 存放下標 let num = 0; // 迴圈取出陣列中的數值 for (var i = 0; i < this.LeftHeight.length - 1; i++) { if (this.scrollTop >= this.LeftHeight[i]) { num = i; } } // 儲存下標 this.setState({ curr: num,}); } // 判斷滾動的值和陣列中的值相等 開關為true if (this.scrollTop == this.LeftHeight[this.state.curr]) { setTimeout(() => { this.Swich = true; }); } } render() { return ( <div className="box"> <div className="scroll"> <div className="list-left"> {this.state.list.map((item,index) => ( <div className="left-item" ref="scrollLeft" className={this.state.curr === index ? "active" : "left-item"} key={item.id} onClick={this.FnTable.bind(this,index)} > {item.title} </div> ))} </div> <div className="list-right" ref="leftItem" onScroll={this.FnScroll.bind(this)} > {this.state.LeftList.map((item) => ( <div className="right-item" wFxbofokey={item.id} style={{ height: item.height }} > <div className="item-title">{item.title}</div> </div> ))} </div> </div> </div> ); } }
CSS樣式,檔案格式是Less格式
.box { width: 100vw; height: 100vh; .scroll { width: 100vw; height: 100vh; display: flex; .list-left { width: 200px; height: 100vh; background: rgb(151,151,151); .left-item { height: 120px; text-align: center; line-height: 120px; color: #ffffff; font-size: 36px; border: 3px solid #ffffff; box-sizing: border-box; } .active { height: 120px; text-align: center; line-height: 120px; color: #ffffff; font-size: 36px; border: 3px solid #ffffff; background-color: #f100d9; box-sizing: border-box; } } .list-right { width: 100vw; height: 100vh; www.cppcns.com background-color: #15ff00; overflow: scroll; .right-item { height: 400px; border: 5px solid #0040ff; font-size: 40px; color: #ffffff; box-sizing: border-box; } } } }
效果圖:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。