Rumah > hujung hadapan web > View.js > Mengapakah Reflect mesti digunakan untuk Proksi dalam vue3?

Mengapakah Reflect mesti digunakan untuk Proksi dalam vue3?

PHPz
Lepaskan: 2023-06-01 18:55:06
ke hadapan
1475 orang telah melayarinya

Mereka yang telah menggunakan Vue tahu bahawa pelaksanaan respons Vue menggunakan Proksi, dan ia digunakan dengan Reflect Perkara yang paling ketara apabila melihat dokumen Proxy dan Reflect ialah kaedah statik objek Reflect mempunyai nama yang sama dengan nama yang sama. Kaedah proksi proksi, dan Reflect boleh mengendalikannya menggunakan objek, proksi boleh memproksi objek, tetapi saya tidak tahu mengapa kadang-kadang anda mesti menggunakan Reflect dalam kaedah proksi Proksi

Operasi asas

Kaedah statik objek Reflect mempunyai nama yang sama dengan kaedah proksi Proksi Terdapat 13 jenis Contoh get dan set adalah seperti berikut

const tempObj = { a: 1 };
Reflect.get(tempObj, 'a'); // 返回 1
Reflect.set(tempObj, 'a', 2); // 返回true 表示设置成功, a的值变2

const tempObj1 = { a: 1 };
const handler = {
  get: function (obj, prop, receiver) {
    return prop === 'a' ? 1000 : obj[prop];
  },
  set: function (obj, prop, value, receiver) {
    console.log(prop);
    obj[prop] = prop === 'a' ? 6 : value;
    return true;
  },
};
const proxyObj = new Proxy(tempObj1, handler);
proxyObj.a; // proxyObj => {a: 1000}
proxyObj.a = 2; // proxyObj => {a: 6}
Salin selepas log masuk

Soalan

Jika Proksi tidak melakukan yang lain. operasi dan kembali secara langsung secara normal

const tempObj1 = { a: 1 };
const handler = {
  get: function (obj, prop, receiver) {
    return obj[prop];
  },
  set: function (obj, prop, value, receiver) {
    obj[prop] = value
    return true;
  },
};
const proxyObj = new Proxy(tempObj1, handler);
proxyObj.a; // proxyObj => {a: 1}
proxyObj.a = 2; // proxyObj => {a: 2}
Salin selepas log masuk

Dalam situasi di atas, Proksi boleh diselesaikan tanpa Menggunakan Reflect untuk mengendalikan pemintasan adalah lebih mudah daripada menggunakan Reflect

Objek yang berbeza, objek dengan get

const tempObj1 = {
  a: 1,
  get value() {
    console.log(this === proxyObj); // false
    return this.a;
  },
};
const handler = {
  get: function (obj, prop, receiver) {
    return obj[prop];
  },
  set: function (obj, prop, value, receiver) {
    obj[prop] = value;
    return true;
  },
};
const proxyObj = new Proxy(tempObj1, handler);
proxyObj.value; // 1
Salin selepas log masuk

Nilai yang dicetak dalam nilai di atas adalah palsu, Hasil yang dijangkakan harus benar, tetapi nilai objek asal yang digunakan dalam proksi harus diambil, jadi ini menunjuk ke objek asal , jadi nilainya palsu

Walaupun ini menunjukkan nilai yang salah, nilai yang diperolehi masih betul Ini Tiada sebab tertentu

const parent = {
  a: 1,
  get value() {
    console.log(this === child); // false
    return this.a;
  },
};
const handler = {
  get: function (obj, prop, receiver) {
    return obj[prop];
  },
  set: function (obj, prop, value, receiver) {
    obj[prop] = value;
    return true;
  },
};

const proxyObj = new Proxy(parent, handler);
const child = Object.setPrototypeOf({ a: 2 }, proxyObj);
child.value; // 1
Salin selepas log masuk

Ada masalah. . Hasil keluaran adalah berbeza daripada apa yang dijangkakan Ini sepatutnya menunjuk kepada anak, tetapi ia menunjukkan kepada ibu bapa

Refleksi

Jika Reflect.get(obj, prop) digantikan dengan obj[prop] , maksudnya tak ada perubahan makna dan hasil adalah sama kan ada parameter penerima lain yang tidak berguna? kursus konsisten dengan jangkaan.

r tidak merujuk kepada objek proksi, mahupun objek asal, tetapi konteks pelaksanaan (ada pepatah bahawa tanpa mengubah ini dengan cara tertentu, Sesiapa yang memanggil menunjuk kepada siapa, ini adalah apa yang dijangkakan), di sini
memanggil

, jadi titik yang dijangkakan seharusnya this, di sini anda mungkin berfikir bahawa penggunaan terus receive tidak akan berfungsi, ini akan menyebabkan limpahan pelaksanaan, child Bersamaan dengan value , child belum dilaksanakan lagi, jika receiver[prop] dilaksanakan semula, ia akan terus dilaksanakan selama-lamanya Parameter receiver[prop] dalam child.valuechild.value telah diubah suai receiver[prop] tanpa menambah

, dan selepas menambahkannya menunjuk ke

Reflect.get(target, key, receiver)receiver Pastikan anda menggunakan this apabila this digunakan dalam objek proksi , dengan cara ini, kita boleh sentiasa mendapat nilai yang dijangkakantargetreceiver

Ringkasan
Objek proksi dalam vue3 mendapat nilai yang dijangkakan, dan ia dikumpulkan dan dikemas kini dalam pemintasan, jadi pastikan anda menggunakan

dalam fungsi pemintasan this untuk mengendalikan Reflect

Bagaimana anda sentiasa mendapat nilai yang dijangkakan seolah-olah tiada proksi

Atas ialah kandungan terperinci Mengapakah Reflect mesti digunakan untuk Proksi dalam vue3?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
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