React + ts realisiert den sekundären Verknüpfungseffekt

React + ts realisiert den sekundären Verknüpfungseffekt

In diesem Artikel wird der spezifische Code von React + ts zur Erzielung des sekundären Verknüpfungseffekts zu Ihrer Information freigegeben. Der spezifische Inhalt ist wie folgt

.tsx-Dateien

 importiere { Komponente, createRef} aus 'react'
 
importiere './index.less'
 
Schnittstelle Status {
  oben: beliebig
  Schaltflächenliste: Schaltfläche[]
  Inhaltsliste: Inhalt[]
  ButtonIndex: Nummer
}
Schnittstelle Schaltfläche {
  ID: Zeichenfolge
  Text: Zeichenfolge
}
Schnittstelle Inhalt {
  ID: Zeichenfolge
  Text: Zeichenfolge
  Höhe: Zahl
  oben: Nummer
}
Schnittstelle Requisiten {
 
}
 
Klasse Treppen erweitert Komponente<Props, State>{
  Linke Liste: Button[]
  RightList: Inhalt[]
  Kaiguan: Boolescher Wert
  rechts = createRef<HTMLDivElement>()
  links = erstelleRef<HTMLDivElement>()
  LeftTex = createRef<HTMLDivElement>()
  // oTop: Zahl | undefiniert
  Ansichtshöhe: Zahl | nicht definiert
  offHeight: Zahl | nicht definiert
  Linker Text = createRef<HTMLDivElement>()
  oben: Zahl | undefiniert
  oTop: Zahl | undefiniert
  Konstruktor(Requisiten: Requisiten) {
    super(Requisiten)
    dieser.Zustand = {
      Schaltflächenliste: [],
      Inhaltsliste: [],
      ButtonIndex: 0,
      oben: 0
    }
    dies.LeftList = []
    dies.RechteListe = []
    dies.kaiguan = wahr
    this.oTop = 0
  }
  componentDidMount() {
    dies.BtnList(20)
    diese.ConList(20)
    dies.setState({
      ButtonList: diese.LeftList,
      Inhaltsliste: this.RightList
    })
  }
  getRandom(m: Zahl, n: Zahl): Zahl {
    gibt parseInt zurück (`${Math.random() * (m - n) + n}`);
  }
  BtnList(n: Zahl) {
    für (sei i = 0; i < n; i++) {
      dies.LeftList.push({
        ID: `a${i}`,
        Text: `Button${i}`,
      });
    }
  }
  ConList(n: Zahl) {
    sei ConTop = 0;
    für (sei i = 0; i < n; i++) {
      Lassen Sie RandomHeight = this.getRandom(736, 1400);
      dies.RightList.push({
        ID: `b${i}`,
        Text: `Titel${i}`,
        Höhe: Zufällige Höhe,
        oben: ConTop,
      });
      ConTop += Zufällige Höhe;
    }
  }
  FnScroll() {
    // konsole.log(11)
    wenn (dies.richtig.aktuell) {
      dies.oTop = dies.right.current.scrollTop;
      wenn (dies.kaiguan) {
        // konsole.log(111)
        lass count = 0
        für (var i = 0; i < dieser.Zustand.Inhaltsliste.Länge; i++) {
          wenn (dieses.oTop >= dieser.zustand.ContentList[i].top) {
            Anzahl = i
          }
          dies.setState({
            ButtonIndex: Anzahl
          })
        }
        // konsole.log(ButtonIndex,Anzahl)
      }
    }
    // eslint-nächste-Zeile deaktivieren
    wenn (dieses.oTop == dieser.Zustand.ContentList[dieser.Zustand.ButtonIndex].top) {
      dies.kaiguan = wahr;
    }
  }
  Fn(index: beliebig, ev: React.MouseEvent<HTMLDivElement>) {
    this.viewHeight = Dokument.documentElement.clientHeight / 2
    let target = ev.target als HTMLDivElement
    dies.offHeight = ziel.offsetTop
    // konsole.log(diese.offHeight)
    wenn (diese.offHeight > diese.viewHeight) {
      wenn (dieses.LeftTex.current) {
        dies.LeftTex.current.scrollTo({
          oben: this.offHeight - this.viewHeight - target.clientHeight / 2,
          Verhalten: "glatt",
        })
      }
      // konsole.log(dieses.LeftTex.current)
    }
    // Konsole.log(diese.offHeight - diese.viewHeight - Ziel.clientHeight / 2)
    dies.kaiguan = falsch;
    // diese.offHeight = ev.target.offsetTop
    // konsole.log(ev.target)
    wenn (dies.richtig.aktuell) {
      dies.rechts.aktuelles.scrollen({
        oben: diese.RechteListe[index].oben,
        Verhalten: "glatt",
      });
    }
    dies.setState({
      ButtonIndex: Index
    })
  }
  ButtonIndex(index: Zahl) {
    wenn (Index >= 3) {
      wenn (dies.links.aktuell und dieser.Linkstext.aktuell) {
        this.left.current.scrollTop = (Index - 3) * this.Lefttext.current.offsetHeight;
      }
    }
    wenn (Index < 3) {
      wenn (dies.links.aktuell) {
        dies.left.current.scrollTop = 0;
      }
    }
    dies.setState({
      ButtonIndex: Index
    })
  }
 
  rendern() {
    let footList = dieser.Zustand.ButtonList
    zurückkehren (
      <div>
        <div Klassenname = "Über">
          <div Klassenname="scrollen">
            <div Klassenname = "Box1" ref = "Box1"></div>
            <div Klassenname = "Box2" ref = "Box2"></div>
            <div Klassenname="scroll-con" ref="scroll-con">
              <div Klassenname="links" ref={this.LeftTex}>
                <div Klassenname="links-con">
                  {footList.map((Element, Index) =>
                    <div onClick={this.Fn.bind(this, index)} ref={this.Lefttext} className={this.state.ButtonIndex === index ? "ac left-txt" : "left-txt"} key={item.id} >
                      {item.text}
                    </div>
                  )}
                </div>
              </div>
              <div className="rechts" ref={diese.rechts} onScroll={diese.FnScroll.bind(diese)}>
                <div Klassenname="rechts-con">
                  <div
                    Klassenname="right-txt"
                    ref="right-txt">
                    {this.state.ContentList.map((item) =>
                      <div style={{ Höhe: item.height }} className="right-title" key={item.id}>{item.text} </div>
                    )}
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
 
    )
 
  }
 
}
 
Standardtreppe exportieren

.less-Dateien

.scroll {
  Breite: 100vw;
  Höhe: 100vh;
  Überlauf-y: scrollen;
 
  .box1 {
    Höhe: 300px;
    Hintergrund: #000;
    Breite: 100 %;
  }
  .box2 {
    Höhe: 200px;
    Hintergrund: Tomate;
    Breite: 100 %;
  }
  .box3 {
    Position: -WebKit-Sticky;
    Position: klebrig;
    oben: 0;
    Höhe: 100px;
    Hintergrund: blassviolettrot;
    Z-Index: 999;
    Breite: 100 %;
  }
  .scroll-con {
    Breite: 100vw;
    Höhe: 100vh;
    Position: -WebKit-Sticky;
    Position: klebrig;
    oben: 100px;
    Anzeige: Flex;
    .links,
    .Rechts {
      Höhe: 100vh;
      Überlauf-y: scrollen;
    }
    .links {
      Breite: 20vw;
      .links-txt {
        Breite: 20vw;
        Höhe: 100px;
        Textausrichtung: zentriert;
        Zeilenhöhe: 100px;
        Hintergrund: rot;
      }
      .left-txt.ac {
        Hintergrund: Hellkoralle;
        Z-Index: 999;
      }
    }
    .Rechts {
      Breite: 80vw;
 
 
      .Rechtstitel {
        Breite: 100 %;
        Höhe: 5vh;
        Hintergrund: dunkelblau;
        Farbe: Aqua;
        Zeilenhöhe: 5vh;
      }
    }
  }
}

Zum Schluss fügen Sie den von Ihnen definierten Ordner zur Route hinzu

Das Wirkungsdiagramm sieht wie folgt aus

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Implementierung von TypeScript im React-Projekt
  • Zusammenfassung der Verwendung von TypeScript in React-Projekten
  • Standardtypen für generische TypeScript-Parameter und neue Option zur strikten Kompilierung
  • Schritt-für-Schritt-Anleitung zum Erstellen einer Kalenderkomponente mit React
  • Praktische Tipps zur TS-Typfilterung im Front-End React Nextjs

<<:  Zusammenfassung gängiger Nginx-Techniken und Beispiele

>>:  So deklarieren Sie einen Cursor in MySQL

Artikel empfehlen

Ubuntu 19.04 Installationstutorial (Schritte in Bild und Text)

1. Vorbereitung 1.1 Laden Sie VMware 15 herunter ...

Detaillierte Erklärung von PID und Socket in MySQL

Inhaltsverzeichnis 1. Einführung in die PID-Datei...

Details zum MySQL-Datentyp

Inhaltsverzeichnis 1. Numerischer Typ 1.1 Klassif...

Beispiel für eine Routing-Berechtigungsverwaltungsmethode in Vue2/vue3

1. Es gibt im Allgemeinen zwei Methoden zur Steue...

Mysql-Optimierungstool (empfohlen)

Vorwort Als ich heute auf GitHub gestöbert habe, ...

Installation und Verwendung von TypeScript und grundlegende Datentypen

Der erste Schritt besteht darin, TypeScript globa...

Detaillierte Erklärung einiger Einstellungen für Tabellenanpassung und Überlauf

1. Zwei Eigenschaften des Tabellen-Resets: ①borde...

Grafisches Tutorial zur Installation von MySQL5.7.18 im Windows-System

MySQL-Installationstutorial für Windows-Systeme h...

Einführung in HTML für Frontend-Entwickler

1 Einführung in HTML 1.1 Erste Erfahrungen mit Co...

Ein umfassendes Verständnis der funktionalen Komponenten von Vue.js

Inhaltsverzeichnis Vorwort Funktionale React-Komp...

So fragen Sie die Schnittmenge von Zeiträumen in MySQL ab

Mysql-Abfragezeitraum-Schnittmenge Anwendungsszen...

CentOS8-Netzwerkkarten-Konfigurationsdatei

1. Einleitung CentOS8-Systemupdate, die neue Vers...

Die Organisation W3C gibt Stilempfehlungen für HTML4

Dies ist die Stilempfehlung der W3C-Organisation f...