Das Vue-Cropper-Plugin realisiert die Kapselung der Bildaufnahme- und Upload-Komponente

Das Vue-Cropper-Plugin realisiert die Kapselung der Bildaufnahme- und Upload-Komponente

Der spezifische Code zum Einkapseln der Bildaufnahme- und Upload-Komponente basierend auf dem Vue-Cropper-Plugin wird zu Ihrer Information bereitgestellt. Der spezifische Inhalt ist wie folgt

Bedarfsszenario:

Die Backend-Entwicklung erfordert das Hochladen von Bildern und deren Zuschneiden in den entsprechenden Proportionen. Diese Komponentenentwicklung verwendet die Ant Design Vue-Komponentenbibliothek mit dem Vue-Cropper-Plugin zur Kapselung

Die Umsetzung erfolgt wie folgt

html

<Vorlage>
  <div>
    <a-hochladen
      Name = "Avatar"
      Listentyp = "Bildkarte"
      Klasse = "Avatar-Uploader"
      :show-upload-list="false"
      :custom-request="BenutzerdefinierteAnfrage"
      :before-upload="vor dem Hochladen"
      :style="`Breite: ${width}; Höhe: ${height};`"
    >
      <Bild
        v-if="Bild-URL && !wird geladen"
        :src="Bild-URL"
        alt="Avatar"
        :style="`Breite: ${width}; Höhe: ${height};`"
      />
      <div v-sonst>
        <a-icon :type="wird geladen ? 'wird geladen' : 'plus'" />
        <div class="ant-upload-text">Bilder hochladen</div>
      </div>
    </a-upload>
    <a-modal
      v-Modell = "imageCut.isShowModal"
      Titel="Bildaufnahme"
      Breite="400px"
      @ok="fertig"
      @cancel="Bild ausschneiden.schließen"
    >
      <div Klasse="cropper-content" v-if="imageCut.isShowModal">
        <div Klasse="cropper" Stil="text-align:center">
          <vueCropper
            ref="Beschneider"
            :img="imageCut.imgFile"
            :outputSize="Ausgabegröße"
            :outputType="Ausgabetyp"
            :info="Informationen"
            :voll="voll"
            :canMove="kannBewegen"
            :kannBoxVerschieben="kannBoxVerschieben"
            :original="Original"
            :autoCrop="automatisch zuschneiden"
            :fixiert="behoben"
            :festeNummer="festeNummer"
            :centerBox="Mittelbox"
            :infoTrue="infoTrue"
            :festeBox="festeBox"
          ></vueCropper>
        </div>
      </div>
    </a-modal>
  </div>
</Vorlage>

js

<Skript>
importiere { uploadImage } von '@/api/common'
importiere { VueCropper } von "vue-cropper";
Standard exportieren {
  Name: 'BildUpload',
  Komponenten: { VueCropper },
  Daten() {
    zurückkehren {
      wird geladen: falsch,
      Bildschnitt: {
        isShowModal: false,
        imgDatei: '',
        init: imgFile => {
          this.imageCut.imgFile = Bilddatei
          this.imageCut.isShowModal = true
        },
        schließen: () => {
          this.imageCut.imgFile = ''
          this.imageCut.isShowModal = false
        }
      }
    }
  },
  Requisiten: {
    imageUrl: Zeichenfolge,
    Breite: {
      Typ: Zeichenfolge,
      Standard: „100px“
    },
    Höhe:
      Typ: Zeichenfolge,
      Standard: „100px“
    },
    kann ausschneiden: {
      Typ: Boolean,
      Standard: false
    },
    Info:
      Typ: Boolean,
      Standard: false
    }, // Informationen zur Größe des Zuschneidefelds outputSize: {
      Typ: Nummer,
      Standard: 0,8
    }, // Die Qualität des zugeschnittenen Bildes outputType: {
      Typ: Zeichenfolge,
      Standard: „jpeg“
    }, // Zuschneiden zum Erzeugen des Bildformats canScale: {
      Typ: Boolean,
      Standard: true
    }, // Ob das Bild das Zoomen mit dem Scrollrad zulässt autoCrop: {
      Typ: Boolean,
      Standard: true
    }, // Ob standardmäßig ein Screenshot-Rahmen generiert werden soll // autoCropWidth: 300, // Die Standardbreite des Screenshot-Rahmens // autoCropHeight: 200, // Die Standardhöhe des Screenshot-Rahmens fixedBox: {
      Typ: Boolean,
      Standard: false
    }, // Behoben: Screenshot-Framegröße kann nicht geändert werden behoben: {
      Typ: Boolean,
      Standard: true
    }, // Ob das feste Verhältnis von Breite und Höhe des Screenshot-Rahmens aktiviert werden soll fixedNumber: {
      Typ: Array,
      Standard: () => [1, 1]
    }, // Das Seitenverhältnis des Screenshot-Frames full: {
      Typ: Boolean,
      Standard: true
    }, // Ob der Screenshot in der Originalproportion ausgegeben werden soll canMove: {
      Typ: Boolean,
      Standard: false
    },
    kannBox verschieben: {
      Typ: Boolean,
      Standard: true
    }, // Kann der Screenshot-Rahmen ins Original gezogen werden: {
      Typ: Boolean,
      Standard: false
    }, // Rendere das hochgeladene Bild entsprechend dem Originalverhältnis centerBox: {
      Typ: Boolean,
      Standard: true
    }, // Ist das Screenshot-Feld auf das Bild beschränkt? infoTrue: {
      Typ: Boolean,
      Standard: true
    } // true, um die tatsächliche Breite und Höhe des Ausgabebildes anzuzeigen. false, um die Breite und Höhe des Screenshot-Rahmens anzuzeigen. },
  Methoden: {
    vorUpload(Datei) {
      const isJpgOrPng = Dateityp === 'Bild/jpeg' || Dateityp === 'Bild/png'
      wenn (!istJpgOrPng) {
        this.$message.error('Bitte laden Sie eine JPG- oder PNG-Datei hoch!')
      }
      const isLt2M = Dateigröße / 1024 / 1024 < 2
      wenn (!isLt2M) {
        this.$message.error('Bitte laden Sie eine Datei unter 2 MB hoch!')
      }
      Rückgabewert ist JpgOrPng und isLt2M
    },
    benutzerdefinierteAnfrage(Datei) {
      wenn (dies.kannSchnitt) {
        this.readFile(Datei.Datei)
      } anders {
        dies.laden = wahr
        const formData = new FormData()
        formData.append('fileIdcard', datei.datei)
        Bild hochladen(formData).then(res => {
          dies.laden = falsch
          dies.$emit('uploadSuccess', res.ossUrl)
        })
      }
    },
    leseDatei(Datei) {
      var reader = neuer FileReader()
      reader.readAsDataURL(Datei)
      reader.onload = () => {
        dies.imageCut.init(reader.result)
      }
    },
    beenden() {
      dies.$refs.cropper.getCropBlob(data => {
        dies.laden = wahr
        // Auf Alibaba Cloud-Server hochladen const formData = new FormData()
        formData.append('fileIdcard', Daten)
        Bild hochladen(formData).then(res => {
          dies.imageCut.close()
          dies.laden = falsch
          dies.$emit('uploadSuccess', res.ossUrl)
        })
      })
    }
  }
}
</Skript>

CSS

<style lang="less">
.avatar-uploader > .ant-upload {
  Breite: 100 %;
  Höhe: 100%;
}
.ant-upload-select-picture-card ich {
  Schriftgröße: 32px;
  Farbe: #999;
}

.ant-upload-Bildkarte auswählen .ant-upload-text {
  Rand oben: 8px;
  Farbe: #666;
}
.cropper-Inhalt {
  .cropper {
    Breite: automatisch;
    Höhe: 400px;
  }
}
</Stil>

Komponentenverwendung und Anweisungen

<Bild-Upload
        :imageUrl="form.diagramUrl"
        @uploadSuccess="UploadErfolgreich"
        Breite="160px"
        Höhe="90px"
        :kann-bearbeiten="kannSchneiden"
        :feste Zahl="[16,9]"
      />

Beim Aufrufen der Komponente müssen Sie das Attribut canEdit übergeben, um anzugeben, ob die Komponente die Zuschneidefunktion startet, nachdem das Bild ausgewählt wurde. Der Standardwert ist, das Zuschneiden zu deaktivieren. Wenn das Zuschneiden erforderlich ist, können Sie das Attribut fixedNumber übergeben, um das Seitenverhältnis des Zuschneidefelds zu definieren.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Vue implementiert Throttle oder Debounce als Komponente oder Plug-In
  • Vue verwendet das zTree-Plugin, um ein Beispiel für die Operation einer Baumkomponente zu kapseln
  • Beispiel einer benutzerdefinierten Paging-Plugin-Komponente in Vue
  • Implementierung der responsiven, adaptiven Karussell-Komponenten-Plug-In-Funktion VueSliderShow basierend auf Vue2x
  • Verwendung benutzerdefinierter globaler Vue-Komponenten (benutzerdefinierte Plug-Ins)
  • Das Bootstrap-Select-Plugin ist als Vue2.0-Komponente gekapselt
  • Zusammenfassung der Unterschiede und Verwendung von Plugins und Komponenten in Vue

<<:  Lösung für das Problem, dass Docker-Container nicht gestoppt oder beendet werden können

>>:  Einige etwas komplexere Verwendungsbeispielcodes in MySQL

Artikel empfehlen

Detaillierte Erklärung der Semiotik in Html/CSS

Basierend auf Theorien wie Saussures Sprachphilos...

Eine sehr detaillierte Erklärung des Linux DHCP-Dienstes

Inhaltsverzeichnis 1. DHCP-Dienst (Dynamic Host C...

Detaillierte Erklärung der MySQL InnoDB-Indexerweiterung

Indexerweiterung: InnoDB erweitert automatisch je...

Analyse von MySQL-Parallelitätsproblemen und -Lösungen

Inhaltsverzeichnis 1. Hintergrund 2. Langsame Abf...

So verwenden Sie die MySQL-Indexzusammenführung

Die Indexzusammenführung ist ein intelligenter Al...

Stabile Version von MySQL 8.0.18 veröffentlicht! Hash Join ist wie erwartet da

Die stabile Version (GA) von MySQL 8.0.18 wurde g...

So verwenden Sie den Linux-Befehl „locate“

01. Befehlsübersicht Der Befehl „locate“ ist eige...

18 allgemeine Befehle in der MySQL-Befehlszeile

Bei der täglichen Wartung und Verwaltung von Webs...

Detaillierte Erklärung eines einfachen Schneeeffektbeispiels mit JS

Inhaltsverzeichnis Vorwort Hauptimplementierungsc...

Allgemeine Textverarbeitungsbefehle unter Linux und Vim-Texteditor

Lassen Sie uns heute einige gängige Textverarbeit...