Rumah > hujung hadapan web > Soal Jawab bahagian hadapan > Bagaimana untuk mengalih keluar pelekat dalam vue

Bagaimana untuk mengalih keluar pelekat dalam vue

WBOY
Lepaskan: 2023-05-25 10:40:07
asal
475 orang telah melayarinya

Membina aplikasi web berdasarkan vue.js telah menjadi pilihan semakin ramai pembangun bahagian hadapan. Pelaksanaan fungsi pelekat juga telah menjadi bahagian penting dalam banyak aplikasi sosial. Dalam timbunan teknologi vue.js, bagaimana untuk melaksanakan fungsi pelekat? Artikel ini akan memberikan pengenalan terperinci kepada kaedah melaksanakan pelekat dalam vue.js.

1. Sediakan bahan

Untuk melaksanakan fungsi pelekat dalam vue.js, anda perlu menyediakan bahan yang berkaitan. Iaitu, folder yang mengandungi imej pelekat dan fail data yang berkaitan (seperti nama pelekat, lokasi, dll.). Di sini, kami boleh menggunakan require.ensure untuk memuatkan fail bahan secara tidak segerak, supaya aplikasi boleh bertindak balas dengan cepat kepada operasi pengguna dan memendekkan masa memuatkan halaman.

2. Paparkan pelekat

Untuk memaparkan pelekat dalam vue.js, kita perlu menggunakan fungsi pemaparan vue.js untuk menambah elemen pelekat pada halaman. Atas dasar ini, kami boleh mencapai kesan interaktif seperti menyeret dan mengezum pelekat dengan memantau peristiwa tetikus pengguna.

1. Pelekat Render

Dalam fungsi pemaparan vue.js, kita boleh melintasi tatasusunan pelekat melalui arahan v-untuk dan menjadikan setiap pelekat ke halaman.

render(h) {
  return h('div', {
    class: 'sticker-wrapper',
  },
  this.$store.state.stickers.map(sticker => {
    return h('img', {
      class: 'sticker',
      style: {
        top: `${sticker.y}px`,
        left: `${sticker.x}px`,
        width: `${sticker.width}px`,
      },
      domProps: {
        src: sticker.src,
      },
      on: {
        mousedown: (event) => {
          this.dragSticker(event, sticker);
        },
      },
    });
  }));
}
Salin selepas log masuk

2. Penyeretan pelekat

Dengan mendengar acara tetikus, kita boleh mencapai kesan seretan pelekat.

dragSticker(event, sticker) {
  this.selectedSticker = sticker;
  this.dragging = true;
  this.mouseStartX = event.clientX;
  this.mouseStartY = event.clientY;
  this.stickerStartX = sticker.x;
  this.stickerStartY = sticker.y;
  window.addEventListener('mousemove', this.moveSticker);
  window.addEventListener('mouseup', this.finishDrag);
},
moveSticker(event) {
  if (!this.dragging || !this.selectedSticker) {
    return;
  }
  const deltaX = event.clientX - this.mouseStartX;
  const deltaY = event.clientY - this.mouseStartY;
  this.selectedSticker.x = this.stickerStartX + deltaX;
  this.selectedSticker.y = this.stickerStartY + deltaY;
},
finishDrag() {
  this.dragging = false;
  this.selectedSticker = null;
  window.removeEventListener('mousemove', this.moveSticker);
  window.removeEventListener('mouseup', this.finishDrag);
},
Salin selepas log masuk

3. Penskalaan pelekat

Serupa dengan kesan seret dan lepas, kami juga boleh melaraskan saiz pelekat secara dinamik dengan mendengar peristiwa tetikus pengguna.

resizeSticker(event, sticker, handle) {
  this.selectedSticker = sticker;
  event.stopPropagation();
  this.resizing = handle;
  this.mouseStartX = event.clientX;
  this.mouseStartY = event.clientY;
  this.stickerStartX = sticker.x;
  this.stickerStartY = sticker.y;
  this.stickerWidth = sticker.width;
  window.addEventListener('mousemove', this.handleResize);
  window.addEventListener('mouseup', this.finishResize);
},
handleResize(event) {
  if (!this.resizing || !this.selectedSticker) {
    return;
  }
  const deltaX = event.clientX - this.mouseStartX;
  const deltaY = event.clientY - this.mouseStartY;
  const scale = Math.min(Math.abs(deltaX), Math.abs(deltaY));
  if (this.resizing === 'nw') {
    this.selectedSticker.x = this.stickerStartX + deltaX;
    this.selectedSticker.y = this.stickerStartY + deltaY;
    this.selectedSticker.width = this.stickerWidth - scale;
  } else if (this.resizing === 'ne') {
    this.selectedSticker.y = this.stickerStartY + deltaY;
    this.selectedSticker.width = this.stickerWidth + scale;
  } else if (this.resizing === 'sw') {
    this.selectedSticker.x = this.stickerStartX + deltaX;
    this.selectedSticker.width = this.stickerWidth - scale;
  } else if (this.resizing === 'se') {
    this.selectedSticker.width = this.stickerWidth + scale;
  }
},
finishResize() {
  this.resizing = null;
  this.selectedSticker = null;
  window.removeEventListener('mousemove', this.handleResize);
  window.removeEventListener('mouseup', this.finishResize);
},
Salin selepas log masuk

3. Simpan maklumat lokasi pelekat

Agar pengguna mendapat maklumat lokasi pelekat sebelumnya apabila aplikasi dibuka pada masa akan datang, kami boleh menyimpan susunan pelekat di global keadaan vuex, melalui Vuex menguruskan perubahan pada data pelekat.

mutations: {
  addSticker(state, newSticker) {
    state.stickers.push(newSticker);
  },
  removeSticker(state, sticker) {
    state.stickers.splice(state.stickers.indexOf(sticker), 1);
  },
  updateSticker(state, payload) {
    const sticker = payload.sticker;
    if (payload.prop === 'x') {
      sticker.x = payload.value;
    } else if (payload.prop === 'y') {
      sticker.y = payload.value;
    } else if (payload.prop === 'width') {
      sticker.width = payload.value;
    }
  },
},
Salin selepas log masuk

Dengan menggabungkan data yang diuruskan dalam vuex dengan sifat dikira komponen, kami boleh mencapai pengikatan data dua hala dengan mudah.

computed: {
  ...mapState(['stickers']),
},
Salin selepas log masuk

4. Ringkasan

Melalui fungsi pemaparan vue.js dan pengurusan data vuex, kita boleh dengan mudah menyedari kesan interaktif fungsi pelekat dan menyimpan maklumat kedudukan pelekat dalam keadaan global , supaya maklumat lokasi pelekat boleh dipulihkan apabila anda membuka apl seterusnya. Pada masa yang sama, kita juga mesti memberi perhatian untuk mengelakkan masalah seperti pelekat bertindih dan lari dari skrin untuk meningkatkan pengalaman pengguna.

Atas ialah kandungan terperinci Bagaimana untuk mengalih keluar pelekat dalam vue. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan