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

Analisis prinsip responsif vue3 dan penulisan api

藏色散人
Lepaskan: 2021-12-10 14:57:47
ke hadapan
1513 orang telah melayarinya

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岁
Salin selepas log masuk

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岁
Salin selepas log masuk

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岁
Salin selepas log masuk

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);
}
Salin selepas log masuk

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岁
Salin selepas log masuk

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);
Salin selepas log masuk

reaktif juga telah dilaksanakan, maka ref juga telah dilaksanakan

ref

Cara menggunakan ref dalam vue3

var name = ref('tom')
console.log(name.value) // tom
Salin selepas log masuk
Anda perlu menggunakan .value untuk mendapatkan nilai

function ref(name){
    return reactive(
        {
            value: name
        }
    )
}
const name = ref('tom');
console.log(name.value) //tom
Salin selepas log masuk

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
        }
    )
}
Salin selepas log masuk
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!

Label berkaitan:
sumber:juejin.im
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