Reactは二次連結(左右連結)を実現する

Reactは二次連結(左右連結)を実現する

この記事では、二次リンクを実現するためのReactの具体的なコードを参考までに共有します。具体的な内容は次のとおりです。

jsコード

'react' から { コンポーネント } をインポートします
'./linkage.less' をインポートします

クラス Linkage は Component を拡張します {
    コンストラクタ(...引数) {
        super(...引数)

        // 左側を追加します this.FnButtonList = []
        //右側を追加します this.FnContentList = []
        // this.ScrollBys = true に切り替える
        // コンストラクター内で直接実行 --> React は更新されたときにのみレンダリングされます --> componentDidMount は this.init() の取得をトリガーします

    }
    初期化() {
        this.FnSetButton(20)
        // 右側にレンダリング this.FnSetContent(20)
        この状態 = {
            ボタンリスト: this.FnButtonList、
            コンテンツリスト: this.FnContentList、
            //下付きボタンリストインデックス: 0,
        }


    }
    コンポーネントマウント() {
        this.EveryHeight = this.refs['linkage-button-list'].children[0].offsetHeight
    }
    // 乱数 FnSetRandom(m, n) {
        parseInt(Math.random() * (m - n) + n) を返します。
    }
    // 左側のボタンをレンダリングする FnSetButton(n) {
        (var i = 0; i < n; i++) の場合 {
            this.FnButtonList.push({
                id: `ボタン${i}`,
                テキスト: `ボタン${i}`
            })
        }
    }

    // 正しいコンテンツをレンダリングする FnSetContent(n) {
        let ContTop = 0; //最初の要素とページの上部の間の距離 let Random = this.FnSetRandom(750, 1400)
        (i = 0; i < n; i++ とします) {
            this.FnContentList.push({
                高さ: ランダム、
                id: `content${i}`,
                テキスト: `content${i}`,
                トップ: ContTop、
            });
            ContTop += ランダム;
        }
    }

    Fncurrn(インデックス) {
        (インデックス>3)の場合{
            this.refs["linkage-button"].scrollTop = (index - 3) * this.EveryHeight;

        }
        (インデックス<= 3)の場合{
            this.refs["linkage-button"].scrollTop = 0;
        }
    }
    // クリック FnButtonTab(index) {
        this.ScrollBys = false
        this.setState({
            ボタンリストインデックス: インデックス
        })
        this.refs["linkage-content"].scrollTop = this.state.ContentList[index].top;

        //クリックして中央に配置 this.Fncurrn(index)
    }

    //右側と左側をスクロールする FnScroll(ev) {
        this.ContTop = ev.target.scrollTop
        if (this.ScrollBys) {
            n = 0とする

            (i = 0 とします; i < this.state.ContentList.length; i++) {
                もし (
                    this.refs["linkage-content"].scrollTop >= this.state.ContentList[i].top
                ){
                    //ボックスのスクロール距離が右側のボックス内の要素とページの上部の間の距離よりも大きい場合、n = i;
                }
            }
            this.setState({
                ボタンリストインデックス: n
            })

            (Math.abs(n - this.state.ButtonListIndex) === 1)の場合{

                this.setState({
                    ボタンリストインデックス: n
                })
                //中央までスクロールします this.Fncurrn(n)

            }
        }


        this.ContTop == this.state.ContentList[this.state.ButtonListIndex].top) の場合 {
            this.ScrollBys = true
        }

    }

    与える() {
        戻る (
            <div className="リンク">
                <div className="リンクボタン" ref="リンクボタン">
                    <div className="リンクボタンリスト" ref="リンクボタンリスト">
                        {this.state.ButtonList.map((item, index) => <div
                            キー={アイテムID}
                            className={this.state.ButtonListIndex == index ? 'linkage-button-item ac' : 'linkage-button-item'}
                            onClick={this.FnButtonTab.bind(this, インデックス)}
                        >
                            {アイテムテキスト}
                        </div>)}
                    </div>
                </div>
                <div className="link-content" ref="link-content" onScroll={this.FnScroll.bind(this)}>
                    <div className="リンクコンテンツリスト">
                        {this.state.ContentList.map((item) => <div
                            className="リンクコンテンツ項目"
                            キー={アイテムID}
                            スタイル={{ 高さ: item.height + 'px' }}
                        >
                            <div className="linkage-content-title"> {item.text}</div>
                        </div>)}
                    </div>
                </div>
            </div>
        )
    }
}
デフォルトのリンクをエクスポート

cssファイル

体 {
    マージン: 0;
  }
  .linkage {
    幅:100vw;
    高さ:100vh;
    ディスプレイ: フレックス;
    .linkage-button {
      幅: 20vw;
      高さ:100vh;
      背景:チョコレート;
      テキスト配置: 中央;
      フォントサイズ: 40px;
      色: #fff;
      オーバーフロー: スクロール;
      スクロール動作: スムーズ;
      .linkage-button-list {
        幅: 20vw;
        .linkage-button-item.ac {
          背景: 水色;
        }
        .linkage-button-item {
          幅: 20vw;
          高さ: 10vh;
          行の高さ: 10vh;
        }
      }
    }
    .linkage-content {
      幅:80vw;
      高さ:100vh;
      スクロール動作: スムーズ;
      オーバーフロー: スクロール;
      .linkage-content-list {
        .linkage-content-item {
          幅:80vw;
          高さ:100vh;
          .linkage-content-title {
            高さ: 6vh;
            行の高さ: 6vh;
            幅:80vw;
            テキスト配置: 中央;
            背景:シャルトリューズ;
            色: #fff;
            フォントサイズ: 30px;
          }
        }
      }
    }
  }
  .linkage-button::-webkit-scrollbar {
    display: none; /* Chrome Safari */
  }
  .linkage-content::-webkit-scrollbar {
    display: none; /* Chrome Safari */
  }

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Reactの二次連携を実現する方法
  • Reactは二次的連鎖効果(階段効果)を実現する
  • React+tsは二次リンク効果を実現します

<<:  Gitlab-ci を使用してリモート マシンに継続的にデプロイする方法 (詳細なチュートリアル)

>>:  Dockerコンテナにnginxを簡単にデプロイするプロセスの分析

推薦する

HTML の隠しフィールドの紹介と例

基本的な構文: <input type="hidden" name=&qu...

Linux環境でグラフデータベースneo4jを構築する方法の説明

Neo4j (Nosql の 1 つ) は、高性能なグラフ データベース (分散をサポートしていませ...

Vueでキャッシュされたページを管理する方法

目次問題1: 破壊1. 破壊する方法2. いつ破壊するか2.1 解決策1: route.queryを...

MySQLはカスタム関数を使用して親IDまたは子IDを再帰的に照会します

背景: MySQL では、レベルに制限がある場合、たとえば、ツリーの最大深度を事前に決定できる場合、...

Markodwnによるタイトル配置による同期スクロールのアイデアの詳細な説明

序文私が作成中の Markodwn エディターに同期スクロール機能を追加する必要があります。Baid...

React Router V6 のアップデート

目次ReactRouterV6 の変更1. <Switch> が <Routes&...

良い広告にはどのような特徴が必要ですか?

広告業は人間であることに似ていると言う人がいます。これは本当です。優れた広告には、優れた人間と同じよ...

Linuxでホスト名を永続的に変更する方法

ホスト名を変更する場合は、以下の手順に従ってください。ホスト名の使用hostnameコマンドを使用す...

Node.jsミドルウェアの仕組みの詳細な説明

目次Express ミドルウェアとは何ですか? Expressミドルウェアを作成するための要件Exp...

Vue はコンポーネント間の通信をどのように実装しますか?

目次1. 父と息子のコミュニケーション1.1 親コンポーネント --> 子コンポーネント1.2...

163 メールボックスログインボックスインタラクティブデザインの改善体験と共有

LOFTER のコンテストで、ログイン ボックスを再設計できると言及されているのを見ました。過去 2...

HTML の <input> タグの詳細な説明と、それを無効にする方法

定義と使用法<input> タグはユーザー情報を収集するために使用されます。 type ...

CSSのline-heightとheightの詳細な説明

最近、CSS インターフェースに取り組んでいるときに、line-height と height とい...

Linux でテキストから改行文字を削除する方法

復帰文字 ( Ctrl+M ) に不安を感じても心配しないでください。それらを排除する簡単な方法がい...

LDAP ユーザー認証を使用するように Linux を構成する方法

私は CentOS に実装された LDAP ユーザー管理を使用しています。これはインターネット上のほ...