Sobes.tech
Middle+

Да ли сте се икада суочили са губитком реактивности у Vue?

sobes.tech АИ

Одговор од АИ

Da, susreo sam se s tim. Gubitak reaktivnosti u Vue 2 se dešavao uglavnom u dva slučaja:

  1. Direktno dodavanje nove osobine postojećem objektu. Vue 2 prati promene samo za osobine koje su bile prisutne u objektu u trenutku njegovog kreiranja.
  2. Modifikacija niza putem indeksa ili promena njegove dužine. Vue 2 nije mogao reaktivno da prati takve promene direktno.

Za rešavanje ovih problema koristile su se $set metode za objekte i mutator metode za nizove (push, pop, shift, unshift, splice, sort, reverse) ili metode zasnovane na splice za zamenu elemenata/promenu dužine.

// Gubitak reaktivnosti pri dodavanju osobine
const obj = { a: 1 };
// obj.b = 2; // Nereaktivno u Vue 2

// Rešenje sa `$set`
// Vue.$set(obj, 'b', 2);

// Gubitak reaktivnosti pri promeni niza putem indeksa
const arr = [1, 2, 3];
// arr[0] = 4; // Nereaktivno u Vue 2

// Rešenje sa mutator metodama
// arr.splice(0, 1, 4);

// Rešenje sa `$set` za nizove (ređe se koristi, ali je moguće)
// Vue.$set(arr, 0, 4);

U Vue 3, koristeći Composition API i reactive/ref, kao i poboljšani proxy-bazirani reaktivni motor, ovi problemi su uglavnom rešeni. Dodavanje osobina reaktivnim objektima i modifikacija nizova putem indeksa ili dužine postaju podrazumevano reaktivni.

// Vue 3
import { reactive } from 'vue';

const obj = reactive({ a: 1 });
obj.b = 2; // Reaktivno u Vue 3

const arr = reactive([1, 2, 3]);
arr[0] = 4; // Reaktivno u Vue 3
arr.length = 1; // Reaktivno u Vue 3

Međutim, razumevanje uzroka gubitka reaktivnosti u Vue 2 je korisno pri radu sa starim kodom ili prilikom prelaska između verzija.