vue-cropperプラグインは、画像キャプチャとアップロードコンポーネントのカプセル化を実現します。

vue-cropperプラグインは、画像キャプチャとアップロードコンポーネントのカプセル化を実現します。

vue-cropperプラグインをベースにした画像キャプチャとアップロードコンポーネントをカプセル化するための具体的なコードが参考として提供されています。具体的な内容は次のとおりです。

需要シナリオ:

バックエンド開発では、写真をアップロードし、対応する比率で切り取る必要があります。このコンポーネント開発では、カプセル化のためにvue-cropperプラグインを備えたAnt Design Vueコンポーネントライブラリを使用します。

実装は以下のとおりです

html

<テンプレート>
  <div>
    <アップロード
      名前="アバター"
      リストタイプ="絵カード"
      クラス="アバターアップローダー"
      :アップロードリストを表示="false"
      :custom-request="カスタムリクエスト"
      :before-upload="アップロード前"
      :style="`幅: ${width}; 高さ: ${height};`"
    >
      <画像
        v-if="imageUrl && !loading"
        :src="画像URL"
        alt="アバター"
        :style="`幅: ${width}; 高さ: ${height};`"
      />
      <div v-else>
        <a-icon :type="読み込み中? '読み込み中' : 'プラス'" />
        <div class="ant-upload-text">写真をアップロード</div>
      </div>
    </a-アップロード>
    <a-モーダル
      v-model="imageCut.isShowModal"
      title="画像キャプチャ"
      幅="400px"
      @ok="終了"
      @cancel="imageCut.close"
    >
      <div class="cropper-content" v-if="imageCut.isShowModal">
        <div class="cropper" style="text-align:center">
          <vueクロッパー
            ref="クロッパー"
            :img="imageCut.imgファイル"
            :outputSize="出力サイズ"
            :outputType="出力タイプ"
            :info="情報"
            :full="フル"
            :canMove="移動可能"
            :canMoveBox="canMoveBox"
            :original="オリジナル"
            :autoCrop="自動クロップ"
            :fixed="固定"
            :fixedNumber="固定数"
            :centerBox="センターボックス"
            :infoTrue="情報True"
            :fixedBox="固定ボックス"
          </vueクロッパー>
        </div>
      </div>
    </a-modal>
  </div>
</テンプレート>

js

<スクリプト>
'@/api/common' から { uploadImage } をインポートします。
「vue-cropper」から VueCropper をインポートします。
エクスポートデフォルト{
  名前: 'ImageUpload',
  コンポーネント: { VueCropper },
  データ() {
    戻る {
      読み込み中: false、
      画像カット: {
        isShowModal: false、
        画像ファイル: '',
        初期化: imgFile => {
          this.imageCut.imgFile = 画像ファイル
          this.imageCut.isShowModal = true
        },
        閉じる: () => {
          this.imageCut.imgFile = ''
          this.imageCut.isShowModal = false
        }
      }
    }
  },
  小道具: {
    imageUrl: 文字列、
    幅: {
      タイプ: 文字列、
      デフォルト: '100px'
    },
    身長:
      タイプ: 文字列、
      デフォルト: '100px'
    },
    カット可能: {
      タイプ: ブール値、
      デフォルト: false
    },
    情報:
      タイプ: ブール値、
      デフォルト: false
    }, // クロップボックスのサイズ情報 outputSize: {
      タイプ: 数値、
      デフォルト: 0.8
    }, // 切り抜かれた画像の品質 outputType: {
      タイプ: 文字列、
      デフォルト: 'jpeg'
    }, // 画像形式を生成するために切り取る canScale: {
      タイプ: ブール値、
      デフォルト: true
    }, // 画像がスクロールホイールによるズームを許可するかどうか autoCrop: {
      タイプ: ブール値、
      デフォルト: true
    }, // デフォルトでスクリーンショットフレームを生成するかどうか // autoCropWidth: 300, // スクリーンショットフレームのデフォルトの幅 // autoCropHeight: 200, // スクリーンショットフレームのデフォルトの高さ fixedBox: {
      タイプ: ブール値、
      デフォルト: false
    }, // スクリーンショットのフレームサイズを変更できない問題を修正しました。
      タイプ: ブール値、
      デフォルト: true
    }, // スクリーンショットフレームの幅と高さの固定比率を有効にするかどうか fixedNumber: {
      タイプ: 配列、
      デフォルト: () => [1, 1]
    }, // スクリーンショットフレーム全体のアスペクト比: {
      タイプ: ブール値、
      デフォルト: true
    }, // スクリーンショットを元の比率で出力するかどうか canMove: {
      タイプ: ブール値、
      デフォルト: false
    },
    移動できるボックス: {
      タイプ: ブール値、
      デフォルト: true
    }, // スクリーンショットのフレームをドラッグできますか? オリジナル: {
      タイプ: ブール値、
      デフォルト: false
    }, // アップロードされた画像を元の比率に従ってレンダリングします centerBox: {
      タイプ: ブール値、
      デフォルト: true
    }, // スクリーンショットボックスは画像に限定されますか? infoTrue: {
      タイプ: ブール値、
      デフォルト: true
    } // 実際の出力画像の幅と高さを表示するには true、スクリーンショットのフレームの幅と高さを表示するには false },
  メソッド: {
    beforeUpload(ファイル) {
      const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'
      もし (!isJpgOrPng) {
        this.$message.error('JPG または PNG ファイルをアップロードしてください!')
      }
      定数isLt2M = ファイルサイズ / 1024 / 1024 < 2
      もし (!isLt2M) {
        this.$message.error('2MB未満のファイルをアップロードしてください!')
      }
      isJpgOrPng && isLt2M を返す
    },
    カスタムリクエスト(ファイル) {
      (これがカットできる場合){
        this.readFile(ファイル.ファイル)
      } それ以外 {
        this.loading = true
        const フォームデータ = 新しいフォームデータ()
        formData.append('fileIdcard', ファイル.ファイル)
        画像をアップロードします(formData).then(res => {
          this.loading = false
          this.$emit('uploadSuccess', res.ossUrl)
        })
      }
    },
    readFile(ファイル) {
      var リーダー = 新しい FileReader()
      reader.readAsDataURL(ファイル)
      リーダー.onload = () => {
        this.imageCut.init(リーダー.結果)
      }
    },
    仕上げる() {
      this.$refs.cropper.getCropBlob(データ => {
        this.loading = true
        // Alibaba Cloud サーバーにアップロード const formData = new FormData()
        formData.append('fileIdcard', データ)
        画像をアップロードします(formData).then(res => {
          this.imageCut.close()
          this.loading = false
          this.$emit('uploadSuccess', res.ossUrl)
        })
      })
    }
  }
}
</スクリプト>

CS

<スタイル lang="less">
.avatar-uploader > .ant-upload {
  幅: 100%;
  高さ: 100%;
}
.ant-upload-select-picture-card i {
  フォントサイズ: 32px;
  色: #999;
}

.ant-upload-select-picture-card .ant-upload-text {
  上マージン: 8px;
  色: #666;
}
.クロッパーコンテンツ{
  .クロッパー{
    幅: 自動;
    高さ: 400px;
  }
}
</スタイル>

コンポーネントの使用方法と手順

<画像アップロード
        :imageUrl="form.diagramUrl"
        @uploadSuccess="アップロード成功"
        幅="160px"
        高さ="90px"
        :can-edit="canCut"
        :固定数="[16,9]"
      />

コンポーネントを呼び出すときは、canEdit 属性を渡して、画像の選択後にコンポーネントがクロッピング機能を開始するかどうかを指定する必要があります。デフォルト値はクロッピングを無効にします。クロッピングが必要な場合は、fixedNumber 属性を渡してクロッピング ボックスのアスペクト比を定義できます。

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

以下もご興味があるかもしれません:
  • Vueはスロットルまたはデバウンスをコンポーネントまたはプラグインとして実装します
  • Vue は zTree プラグインを使用してツリーコンポーネント操作の例をカプセル化します。
  • Vue のカスタム ページング プラグイン コンポーネントの例
  • Vue2x をベースにしたレスポンシブ アダプティブ カルーセル コンポーネント プラグイン VueSliderShow 関数の実装
  • Vue カスタム グローバル コンポーネント (カスタム プラグイン) の使用
  • ブートストラップ選択プラグインはVue2.0コンポーネントとしてカプセル化されています
  • Vue のプラグインとコンポーネントの違いと使い方のまとめ

<<:  Dockerコンテナを停止または強制終了できない問題の解決策

>>:  MySQLでの少し複雑な使用例コード

推薦する

Navicat Premiumを使用してMySQLデータベースにリモート接続する方法

新しい接続を作成する側がクライアントに相当し、接続される側がサーバーに相当します。手順は次のとおりで...

Dockerコンテナを閉じずに終了する方法の詳細な説明

Docker コンテナに入った後、コンテナを終了すると、コンテナは Exited 状態に変わります。...

Sqoop エクスポート マップ 100% 削減 0% さまざまな理由と解決策でスタック

私はこのようなバグを典型的な「ハムレット」バグと呼んでいます。これは、「エラーメッセージは同じだが、...

MySQL の高度な機能 - データ テーブル パーティショニングの概念とメカニズムの詳細な説明

目次パーティション分割メカニズムSELECTクエリINSERT操作DELETE操作更新操作パーティシ...

Vue3のレスポンシブ原則の詳細な説明

目次Vue2 レスポンシブ原則のレビューVue3 レスポンシブ原則の分析ネストされたオブジェクトの応...

Windows Server win2003、win2008R2、win2012、win2016、win2019 システム バージョン間の違い

最近、Microsoft は 2019 サーバー システムをリリースしました。一般的に、Micros...

MySql 5.7.20 のインストールとデータおよび my.ini ファイルの構成

1. まずMySqlの公式サイトからダウンロードします参考: https://www.jb51.ne...

Ubuntu の MySQL のパラメータ ファイル my.cnf の詳細な分析

序文MySQL に関する私の理解に基づくと、パフォーマンスの最適化作業やマスター スレーブ レプリケ...

CentOS7.4 で JDK1.8 をインストールするためのグラフィカル チュートリアル

Linux インストール JDK1.8 手順1. CentOS に独自の openJDK があるかど...

Docker 上で Redis クラスターを構築する

目次1. イメージをプルする2. Redisコンテナを作成する3. コンテナを起動するためにクラスタ...

MySQLデータベースがNULLを可能な限り避ける理由

MySQL の多くのテーブルには、NULL が列のデフォルト属性であるため、アプリケーションが NU...

Centos7.2 で mysql5.7 データベースをインストールするための詳細な手順

サーバー上の mysql はバージョン 8.0.12 でインストールされており、ローカルのものはバー...

MySQL 8.0.22 zip圧縮パッケージ版(無料インストール)のダウンロード、インストール、および構成手順の詳細

目次最初のステップはMySQLをダウンロードすることですステップ2: ダウンロードした圧縮パッケージ...

Docker を使用して Redis マスター スレーブ レプリケーション クラスターを構築する

マスタースレーブレプリケーションモードのクラスターでは、通常、1 つのマスターノードと 2 つ以上の...

Angularルーティングアニメーションと高度なアニメーション機能の詳細な説明

目次1. ルーティングアニメーション2. グループクエリとスタガー1. ルーティングアニメーションル...