Vue 折りたたみ表示の複数行テキスト コンポーネントの実装コード

Vue 折りたたみ表示の複数行テキスト コンポーネントの実装コード

折りたたみ表示の複数行テキストコンポーネント

複数行のテキスト コンポーネントを折りたたんで表示し、展開に応じて折りたたむかどうかを自動的に決定します。2 つのモード: 展開/折りたたみで全文を表示 (デフォルト)、ポップオーバーで全文を表示

まず、コード

<テンプレート>
  <div class="text-expand" ref="textExpand">
    <div v-if="!(showPopover && showPopoverJudge)">
      <span class="text-expand-content" :style="expandStyle">
        {{ (text === null || text === 未定義 || text === '') ? '--' : テキスト }}
      </span>
      <div class="expander">
        <span
          v-if="showBtn && showBtnJudge"
        >
          <span
            v-if="!showFull"
            クラス="アクションアクション展開"
            @click.stop="showFullFn(true)"
          >
            展開<i v-if="showBtnIcon" class="iconfont iconxiajiantou" />
          </span>
          <span
            v-else
            クラス="アクションアクションパック"
            @click.stop="showFullFn(false)"
          >
            非表示 <i v-if="showBtnIcon" class="iconfont iconshangjiantou" />
          </span>
        </span>
      </div>
    </div>
    <el-popover
      v-else
      :placement="ポップオーバー場所"
      トリガー="ホバー">
      <div class="popover-content">
        {{ 文章 }}
      </div>
      <span class="text-expand-content" :style="expandStyle" slot="reference">{{ テキスト }}</span>
    </el-popover>
  </div>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
  名前: "TextExpand",
  小道具: {
    text: { // テキストコンテンツタイプ: 文字列、
      デフォルト: () => ''
    },
    expand: { // 折り返して行数を表示する type: Number,
      デフォルト: () => 3
    },
    showBtn: { // 展開、折りたたみボタンタイプ: ブール値、
      デフォルト: true
    },
    showBtnIcon: { // 展開、折りたたみアイコン
      タイプ: ブール値、
      デフォルト: true
    },
    showPopover: { // ポップオーバーに全文を表示 type: Boolean,
      デフォルト: false
    },
    popoverPlace: { // ポップオーバーの位置タイプ: 文字列、
      デフォルト: '下'
    }
  },
  データ () {
    戻る {
      showFull: false, // 全文を表示するかどうか expandStyle: '',
      showBtnJudge: false, //ボタンを折りたたんで表示するかどうかを判断 showPopoverJudge: false //ポップオーバーを折りたたんで表示するかどうかを判断
    }
  },
  時計:
    テキスト: 関数 (val) {
      this.judgeExpand()
    }
  },
  マウントされた(){ 
    this.judgeExpand()
  },
  メソッド: {
    showFullFn (値) {
      this.expandStyle = value ? '' : `display: -webkit-box;word-break: break-all;-webkit-line-clamp: ${this.expand};-webkit-box-orient: vertical;text-overflow: ellipsis;overflow: hidden;`
      this.showFull = 値
    },
    judgeExpand () { //折りたたむかどうかを判断します。$nextTick(() => {
        const {展開} = this;
        定数 textExpandStyle = window.getComputedStyle(this.$refs.textExpand)
        const textExpandHeight = parseFloat(textExpandStyle.height) // 合計の高さを取得します const textExpandLineHeight = parseFloat(textExpandStyle.lineHeight) // 行の高さを取得します // 行の高さを計算します const rects = Math.ceil(textExpandHeight / textExpandLineHeight)
        if (rects <= expand) { // 折りたたんで表示する必要はありません this.showBtnJudge = false
          this.showPopoverJudge = false
        } それ以外 {
          this.showBtnJudge = true
          this.showPopoverJudge = true
          this.expandStyle = `display: -webkit-box;word-break: break-all;-webkit-line-clamp: ${this.expand};-webkit-box-orient: vertical;text-overflow: ellipsis;overflow: hidden;`
        }
      })
    }

  }
}
</スクリプト>
<style lang="less" スコープ>
.text-expand{
  &-コンテンツ{
    単語区切り: 全区切り;
    空白: 事前ラップ;
  }
  .エキスパンダー{
    テキスト配置: 左;
    上マージン: 6px;
    。アクション {
      表示: インラインブロック;
      フォントサイズ: 14px;
      色: #0281F0;
      カーソル: ポインタ;
      私 {
        表示: インライン;
        フォントサイズ: 12px;
      }
    }
    .action.アクションパック{
      左マージン: 0;
    }
  }
}
.ポップオーバーコンテンツ{
  最大幅: 40vw;
  最大高さ: 30vh;
  オーバーフロー: 非表示;
  単語区切り: 全区切り;
  オーバーフロー-y: 自動;
}
</スタイル>

使用法

<text-expand :text="テキスト" :expand="2" />

ここに画像の説明を挿入

ここに画像の説明を挿入

<text-expand :text="テキスト" :expand="2" :showBtnIcon="false">

ここに画像の説明を挿入
ここに画像の説明を挿入

<text-expand :text="テキスト" :expand="2" :showPopover="true">

ここに画像の説明を挿入
ここに画像の説明を挿入

これで、vue 折りたたみ表示複数行テキスト コンポーネントに関するこの記事は終了です。vue 折りたたみ表示複数行テキスト コンポーネントに関するその他の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue2.0 折りたたみ可能なリスト v-for ループ表示例
  • Vueはキー表示のショートカットキー効果を取得する入力コンポーネントを実装します
  • Vue+elementUI コンポーネントは、折りたたみ可能な動的レンダリングのマルチレベル サイドバー ナビゲーションを再帰的に実装します。
  • Vue.js の再帰コンポーネントを使用して折りたたみ可能なツリー メニューを実装する (デモ)

<<:  XHTML の一般的な構造タグ

>>:  Dockerイントラネット侵入FRP展開の実装プロセスの分析

推薦する

MySQLの左結合を内部結合に素早く変換するプロセス

日々の最適化プロセス中に、奇妙なことに気付きました。同じ SQL にまったく異なる 2 つの実行プラ...

Ubuntu 14.04 で QT5 をインストール、設定、アンインストールするための詳細な手順

1. 以前 QT5.13 バージョンをダウンロードしましたが、インストール後、Qtcreator を...

MySQLの関連ロックについての簡単な理解

この記事は主にInnoDBのロックに関する知識を素早く理解してもらうことを目的としています。 Roc...

VMware 仮想マシン (CentOS7 イメージ) を使用して Linux をインストールする

1. VMwareのダウンロードとインストールリンク: https://www.jb51.net/s...

Vue ミックスインの使い方の詳しい説明

目次Vue ミックスインの使用ミックスインでのデータアクセスミックスイン/index.jsホーム.v...

CSS3はキングをマッチングさせるときにパーティクルアニメーション効果を実現します

コーディングをしていると、多くのことが同じ結末を迎えることに気づくでしょう。問題を解決する方法は何千...

クールなページング効果を実現するネイティブJS

この記事では、次のような効果を持つ JS ページング効果の例を紹介します。クールだと思いませんか? ...

jQueryフレームワークは、要素の表示と非表示の3つのアニメーションメソッドを実装しています。

目次1. デフォルトで表示と非表示を切り替える2. スライドして表示と非表示を切り替える3. フェー...

Reactでレシピシステムを実装する方法を解説した記事

目次1. レシピ集1.1 プロジェクトの背景1.2 テクノロジースタック1.3 開発環境1.4. プ...

sqlalchemy に基づいて MySQL で追加、削除、変更、クエリ操作を実装する

需要シナリオ:上司は、クロ​​ーラーを使用してMySQLデータベースにデータを書き込んだり更新したり...

Nginx Rewriteモジュールを使用するいくつかのシナリオ

アプリケーションシナリオ1: ドメイン名ベースのリダイレクト会社の古いドメイン名は www.accp...

Vueはdivホイールのズームインとズームアウトを実装します

Vue プロジェクトで div ホイールのズームインとズームアウト、ドラッグ効果、キャンバス効果に似...

Facebook によるインターネット サービスのほぼ完璧な再設計

<br />出典: http://www.a-xuan.cn/?p=197 先ほどFac...

vue3+threejs を使用して iView 公式サイトのビッグウェーブ特殊効果の例を模倣する

目次序文1. レンダリング2. コード3. 背景画像素材要約する序文Threejs は、Web ベー...

MySQL で複数のフィールドを連結する詳細な例

MySQL クエリ結果の行フィールドの結合は、次の 2 つの関数を使用して実装できます。 1. co...