Rumah >hujung hadapan web >View.js >Analisis prinsip responsif vue3 dan penulisan api

Analisis prinsip responsif vue3 dan penulisan api

藏色散人
藏色散人ke hadapan
2021-12-10 14:56:591527semak imbas

Kata Pengantar

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
Anda perlu menggunakan .value untuk mendapatkan nilai

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!

Kenyataan:
Artikel ini dikembalikan pada:juejin.im. Jika ada pelanggaran, sila hubungi admin@php.cn Padam