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

推薦する

nginx共有メモリの仕組みの詳細な説明

Nginx の共有メモリは、高いパフォーマンスを実現できる主な理由の 1 つであり、主にファイル キ...

上部の固定divは半透明効果に設定できます

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

VirtualBoxにOpenSuseをインストールする方法

仮想マシンはホストマシンにインストールされます。 CPU とメモリはホスト マシンと共有する必要があ...

Windows Server 2016 標準キー アクティベーション キー シリアル番号

Windows Server 2016 アクティベーション キーを皆さんと共有したいと思います。wi...

MySQL 8の新機能ROLEの詳しい説明

MySQL ROLE はどのような問題を解決しますか?プロフェッショナルな資質を持ち、権限管理に細心...

MySQLデータベースバックアップのさまざまな実装方法の概要

この記事では、MySQL データベースのバックアップを実装するさまざまな方法について説明します。ご参...

win10でのmysql5.7.21解凍バージョンのインストールチュートリアル

次のように、Win10でMysqlの解凍バージョンをインストールします。環境: win10 64ビッ...

nginx 設定ファイルで環境変数を使用する方法

序文Nginx はパフォーマンスを重視して設計された HTTP サーバーです。Apache や li...

Nginx tp3.2.3 404 問題の解決

最近、Apache を nginx に変更しました。TP プロジェクトを実行に移すと、404 エラー...

Mac で MySQL 8.0.22 のパスワードを取得する方法

Mac 最新バージョンの MySQL 8.0.22 パスワード回復問題の説明:昨日、突然、Macで最...

Vue-Element-Adminはログインジャンプを実現するために独自のインターフェースを統合しています

1. まずリクエスト設定ファイルを見て、axios.createメソッドを見てください。baseUR...

HTML、CSS、RSSフィードが正しいかどうかを確認する無料ツール

この種のエラーに対処するための 1 つの方法は、まずマークアップとスタイルシートを検証することです。...

ログインインターセプションを実装するためのVueルーティング

目次1. 概要2. ログインインターセプションを実装するためのルーティングナビゲーションガード1. ...

Vue プロジェクトで addRoutes を使用する際の問題の解決策

目次序文1. 404 ページ1. 原因2. 解決策2.白い画面を更新する1. 原因2. 解決策3. ...