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

推薦する

MySQL シリーズ データベース設計 3 つのパラダイム チュートリアルの例

目次1. データベース設計の3つのパラダイムに関する知識の説明1. デザインパラダイムとは何ですか?...

Tomcat が https アクセスをサポートするための手順の説明

tomcat を https アクセスに対応させる方法ステップ: (1)キーストアファイルを生成する...

Vue3.0はチェックボックスコンポーネントのカプセル化を実装します

この記事では、チェックボックスコンポーネントのカプセル化を実装するためのvue3.0の具体的なコード...

HTML 中国語文字エンコード標準の概要

HTML では、Web ページで使用されるエンコーディングを指定する必要があります。一般的な指定方法...

独自のネイティブ JavaScript ルーターを作成する方法

目次序文導入JavaScript 履歴 API独自のネイティブJSルーティングを実装するHistor...

SCSS スタイルのコードを 50% 削減する 14 の実践的な経験

序文Sass は CSS3 言語の拡張機能です。Sass を使用すると、より良いスタイルシートをより...

vscodeカスタムvueテンプレートの実装

vscode エディタを使用して vue テンプレートを作成すると、新しい vue ファイルを作成す...

Gobangゲームを実現するためのjsキャンバス

この記事では、Gobangゲームを実装するためのキャンバスの具体的なコードを参考までに共有します。具...

Vueでデータを読み取るためにこれを悪用しないでください

目次序文1. これを使用してデータ内のデータを読み取るプロセス2. Dep.target はいつ存在...

MySQLトリガーはPHPプロジェクトで情報のバックアップ、復元、クリアに使用されます。

例: PHP バックグラウンド コードを通じて、従業員情報を削除したり、削除した従業員情報を復元した...

数字当てゲームを実装するための純粋なJavaScript

100 以内の自然数をランダムに選択し、プレイヤーに 10 ラウンド以内にその数を推測させる数字推...

Web デザインにおける HTML フォーマットと長いファイルに関するヒント

<br />関連記事: Web コンテンツ ページ作成に関する 9 つの実用的な提案、W...

Vue のライフサイクルとフック関数の詳細な説明と典型的な面接の質問

目次1. Vue ライフサイクル2. フック機能2.1 4つの段階と8つの方法に分かれています。 2...

Navicat for MySQL 15 登録とアクティベーションの詳細なチュートリアル

1. Navicat for MySQL 15をダウンロードするhttps://www.navica...

将来人気が出るであろういくつかのナビゲーション方向

<br />今は情報爆発の時代であるだけでなく、サービス爆発の時代でもあります。それはす...