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での少し複雑な使用例コード

推薦する

docker CMD/ENTRYPOINT が sh スクリプトを実行する問題の解決策: not found/run.sh:

Dockerfile の設定に問題はありませんが、ENTRYPOINT コマンドを実行するとエラー...

Java は Apache.POI を使用して HSSFWorkbook を Excel にエクスポートします

Apache.POI の HSSFWorkbook を使用して Excel にエクスポートします。具...

HTML における相対と絶対の使用法と違いの詳細な説明

HTML における相対と絶対の違い: 正直に言うと、HTML は世界で最もシンプルな言語です。タグ言...

WeChatアプレットのスケルトン画面の実装例

目次スケルトンスクリーンとはアプレットでスケルトン画面を生成する方法導入方法表示と非表示ユーザーエク...

CSS3アニメーションを使用して、小さい円から大きい円に拡大し、外側に広がる効果を実現する例

序文この記事では、CSS3アニメーションを使用して、円が小さいものから大きく拡大し、外側に広がる効果...

Vue ショッピングカートのケーススタディ

目次1. ショッピングカートの例2. コードの実装3. まとめ1. ショッピングカートの例一連の学習...

MySQL 外部キー制約とテーブル関係の概要

目次外部キーテーブルの関係を決定する方法テーブル関係を作成する方法1対多の関係 - 従業員テーブルと...

Dockerコンテナのk8sデプロイメントの実装

環境: (docker、k8s クラスター)、前回 docker で起動した Java プログラムの...

Vueコンポーネントは、写真やビデオをアップロードするためのサンプルコードをカプセル化します

まず依存関係をダウンロードします: cnpm i -S vue-uuid ali-oss画像フィール...

意外と知らないLinuxのSSHコマンドの使い方7選を徹底解説

システム管理者は複数のサーバーを同時に管理する場合があり、これらのサーバーは異なる場所に配置されてい...

React refの使用例

目次refとは何かrefの使い方DOM要素に配置するクラスコンポーネントに配置する関数コンポーネント...

HTML 基本要約推奨事項 (テキスト形式)

HTMLテキスト書式タグ 標簽 描述 <b> 定義粗體文本 <em> 呈現...

ウェブサイトのフロントエンドをエレガントでユーザーにとって魅力的なものにする方法

ウェブフロントエンドのウェブサイトの気質は感情であり、言葉なしでユーザーを魅了できる感情です。では、...

nginx 設定ファイルパスとリソースファイルパスを表示する方法

nginx 設定ファイルのパスを表示する nginx -t 経由nginx -t コマンドの本来の機...

Nginx でバージョン番号を隠したり偽造したりする方法

1. デフォルトでアクセスするには、curl コマンドを使用します。 # curl -I http:...