prinsip responsif vue3 ditambah dengan penulisan api, fahami dengan cepat prinsip responsif vue3
Blog GitHub: https://github . com/jiejiangzi/blog/issues/8
Pelaksanaan prinsip responsif Vue3
Tulis sekeping kod dahulu dan lihat
Melaksanakan kesan
var name = 'sl', age = 22; effect1 = () => `我叫${name},今年${age}岁` effect2 = () => `我叫${name},今年${age+1}岁` console.log(effect1()) //我叫sl,今年22岁 console.log(effect2()) //我叫sl,今年23岁 age = 30; console.log(effect1()) //我叫sl,今年30岁 console.log(effect2()) //我叫sl,今年31岁
dan lihat apa yang boleh dioptimumkan?
Pertama sekali: berbilang fungsi, selepas perubahan umur, anda perlu memanggil semula berbilang fungsi secara manual untuk mendapatkan maklumat terkini
Saya berharap berbilang fungsi boleh dipanggil secara automatik selepas mengubah suai maklumat
Cara melaksanakannya
Anda boleh memikirkan untuk menyimpan berbilang fungsi bersama-sama dalam fungsi himpunan, dan apabila umur berubah, berbilang fungsi boleh dipanggil panggilan pencetus
Laksanakan gather and trigger
var name = "sl", age = 22; var tom, joy; effect1 = () => (tom = `我叫${name},今年${age}岁`); effect2 = () => (joy = `我叫${name},今年${age + 1}岁`); var dep = new Set(); function gather() { dep.add(effect1); dep.add(effect2); } function trigger() { dep.forEach((effect) => effect()); } gather(); effect1() effect2() console.log(tom); //我叫sl,今年22岁 console.log(joy); //我叫sl,今年23岁 age = 30; trigger() console.log(tom); //我叫sl,今年30岁 console.log(joy); //我叫sl,今年31岁
Mari kita teruskan dan lihat jika terdapat sebarang titik yang boleh dioptimumkan
Apa yang perlu dilakukan jika pembolehubah ialah satu objek atau berbilang objek
Tetapkan storan apabila pembolehubah ialah jenis primitif
Apabila pembolehubah ialah objek, anda boleh menggunakan peta untuk menyimpannya
Gunakannya apabila anda mempunyai berbilang objek storan Peta lemah
var obj1 = { name: "tom", age: 22 }; var obj2 = { name: "joy", age: 23 }; var tom, joy; effect1 = () => (tom = `我叫${obj1.name},今年${obj1.age}岁`); effect2 = () => (joy = `我叫${obj2.name},今年${obj2.age}岁`); var depsMap = new WeakMap(); function gather(target, key) { let depMap = depsMap.get(target); if (!depMap) { depsMap.set(target, (depMap = new Map())); } let dep = depMap.get(key); if (!dep) { depMap.set(key, (dep = new Set())); } if (target === obj1) { dep.add(effect1); } else { dep.add(effect2); } } function trigger(target, key) { let depMap = depsMap.get(target); if (depMap) { const dep = depMap.get(key); if (dep) { dep.forEach((effect) => effect()); } } } gather(obj1, "age");//收集依赖 gather(obj2, "age");//收集依赖 effect1(); effect2(); console.log(tom); //我叫sl,今年22岁 console.log(joy); //我叫sl,今年23岁 obj1.age = 30; obj2.age = 10; trigger(obj1, "age"); trigger(obj2, "age"); console.log(tom); //我叫sl,今年30岁 console.log(joy); //我叫sl,今年31岁
Mari kita teruskan melihat mata yang boleh dioptimumkan
Yang bergantung di atas pengumpulan koleksi dan pencetus pemberitahuan kemas kini fungsi dikumpul secara manual setiap kali Pencetuskan kemas kini secara manual, adakah terdapat cara untuk mengumpul dan mencetuskan secara automatik
Proksi
Melaksanakan reaktif
Tulis satu fungsi reaktif pertama
function reactive(target) { const handle = { set(target, key, value, receiver) { Reflect.set(target, key, value, receiver); trigger(receiver,key) // 设置值时触发自动更新 }, get(target, key, receiver) { gather(receiver, key); // 访问时收集依赖 return Reflect.get(target, key, receiver); }, }; return new Proxy(target, handle); }
dan kemudian gunakan fungsi reaktif pada kod sebelumnya
var obj1 = reactive({ name: "tom", age: 22 }); var obj2 = reactive({ name: "joy", age: 23 }); var tom, joy; effect1 = () => (tom = `我叫${obj1.name},今年${obj1.age}岁`); effect2 = () => (joy = `我叫${obj2.name},今年${obj2.age}岁`); var depsMap = new WeakMap(); function gather(target, key) { let depMap = depsMap.get(target); if (!depMap) { depsMap.set(target, (depMap = new Map())); } let dep = depMap.get(key); if (!dep) { depMap.set(key, (dep = new Set())); } if (target === obj1) { dep.add(effect1); } else { dep.add(effect2); } } function trigger(target, key) { let depMap = depsMap.get(target); if (depMap) { const dep = depMap.get(key); if (dep) { dep.forEach((effect) => effect()); } } } effect1(); effect2(); console.log(tom); //我叫sl,今年22岁 console.log(joy); //我叫sl,今年23岁 obj1.age = 30; obj2.age = 10; console.log(tom); //我叫sl,今年30岁 console.log(joy); //我叫sl,今年31岁
Kemudian ada masalah lain, iaitu, terdapat fungsi penambahan dep berkod keras dalam fungsi gather
Bagaimana untuk menyelesaikannya Tulis semula fungsi kesan
let activeEffect = null function effect(fn) { activeEffect = fn; activeEffect(); activeEffect = null; // 执行后立马变成null } var depsMap = new WeakMap(); function gather(target, key) { // 避免例如console.log(obj1.name)而触发gather if (!activeEffect) return; let depMap = depsMap.get(target); if (!depMap) { depsMap.set(target, (depMap = new Map())); } let dep = depMap.get(key); if (!dep) { depMap.set(key, (dep = new Set())); } dep.add(activeEffect) //将函数添加到依赖 } effect(effect1); effect(effect2);
reaktif juga telah dilaksanakan, maka ref juga telah dilaksanakan 🎜>
ref
Cara menggunakan ref dalam vue3
var name = ref('tom') console.log(name.value) // tom
function ref(name){ return reactive( { value: name } ) } const name = ref('tom'); console.log(name.value) //tom
Kod penuh
var activeEffect = null; function effect(fn) { activeEffect = fn; activeEffect(); activeEffect = null; } var depsMap = new WeakMap(); function gather(target, key) { // 避免例如console.log(obj1.name)而触发gather if (!activeEffect) return; let depMap = depsMap.get(target); if (!depMap) { depsMap.set(target, (depMap = new Map())); } let dep = depMap.get(key); if (!dep) { depMap.set(key, (dep = new Set())); } dep.add(activeEffect) } function trigger(target, key) { let depMap = depsMap.get(target); if (depMap) { const dep = depMap.get(key); if (dep) { dep.forEach((effect) => effect()); } } } function reactive(target) { const handle = { set(target, key, value, receiver) { Reflect.set(target, key, value, receiver); trigger(receiver, key); // 设置值时触发自动更新 }, get(target, key, receiver) { gather(receiver, key); // 访问时收集依赖 return Reflect.get(target, key, receiver); }, }; return new Proxy(target, handle); } function ref(name){ return reactive( { value: name } ) }
Pembelajaran yang disyorkan: "Pilihan tutorial video 5 vue.js terkini"
Atas ialah kandungan terperinci Analisis prinsip responsif vue3 dan penulisan api. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!