Jadual Kandungan
senario aplikasi
menetapkan pelaksanaan
yang telah ditulis semula oleh proksi vue untuk melaksanakan tindak balas.
Logik di bahagian bawah digunakan untuk memproses respons objek, mari kita teruskan Lihat
(Mempelajari perkongsian video:
Rumah hujung hadapan web View.js Mari kita bincangkan tentang cara $set dilaksanakan dalam Vue?

Mari kita bincangkan tentang cara $set dilaksanakan dalam Vue?

Dec 15, 2022 pm 09:26 PM
vue.js

Mari kita bincangkan tentang cara $set dilaksanakan dalam Vue?

Dalam pembangunan harian, $set juga merupakan API yang sangat praktikal, kerana teras tindak balas Vue2 adalah menggunakan Object.defineProperty ES5 Apabila kita lulus Secara langsung mengubah suai tatasusunan subskrip untuk menukar tatasusunan atau menambah sifat baharu pada objek Pada masa ini, Object.defineproperty tidak boleh memantau perubahan dalam data Pada masa ini, semua orang akan menggunakan $set untuk membenarkan operasi pengubahsuaian untuk bertindak balas , kita perlu tahu mengapa Seterusnya, mari kita lihat bagaimana $set dalam Vue dilaksanakan. [Cadangan berkaitan: tutorial video vuejs, pembangunan bahagian hadapan web]

senario aplikasi

 let dataArr = ["item1"];
 let dataObject = {
      name: "ccs"
    };

    dataArr[2] = "item2";
    dataObject.age = 22;
    响应失败,页面没有显示更新新增的数据

    this.$set(this.dataArr,2,'item2')
    this.$set(this.dataObject,'age',22)
    响应成功,页面显示更新新增的数据
Salin selepas log masuk

menetapkan pelaksanaan

Seterusnya, mari kita lihat definisi $set dalam Vue

function set(target: Array<any> | Object, key: any, val: any): any {
  if (
    process.env.NODE_ENV !== "production" &&
    (isUndef(target) || isPrimitive(target))
  ) {
    warn(
      `Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`
    );
  }
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    target.length = Math.max(target.length, key);
    target.splice(key, 1, val);
    return val;
  }
  if (key in target && !(key in Object.prototype)) {
    target[key] = val;
    return val;
  }
  const ob = (target: any).__ob__;
  if (target._isVue || (ob && ob.vmCount)) {
    process.env.NODE_ENV !== "production" &&
      warn(
        "Avoid adding reactive properties to a Vue instance or its root $data " +
          "at runtime - declare it upfront in the data option."
      );
    return val;
  }
  if (!ob) {
    target[key] = val;
    return val;
  }
  defineReactive(ob.value, key, val);
  ob.dep.notify();
  return val;
}
Salin selepas log masuk

Dalam kod sumber, mula-mula tentukan sama ada sasaran set ialah undefined dan 基本类型. Jika ia undefined atau 基本类型, maka Ralat dilaporkan,
kerana pengguna tidak sepatutnya menetapkan perkara kepada jenis yang tidak ditentukan dan asas ,
dan kemudian menentukan sama ada sasaran adalah tatasusunan dan sama ada kunci ialah indeks undang-undang Indeks undang-undang bermakna nilai adalah Integer lebih besar daripada atau sama dengan 0,
adalah betul jika kedua-dua syarat adalah benar 目标数组调用splice方法插入或者修改数组,
di sini splice tidak. splice biasa, ialah sambatan dalam puisi Wang Wei , ia adalah susunan sambatan

yang telah ditulis semula oleh proksi vue untuk melaksanakan tindak balas.

$set melaksanakan tindak balas pengubahsuaian tatasusunan Ia merupakan sebahagian daripada kaedah tatasusunan yang ditulis semula oleh proksi. . Penulisan semula proksi dalam vue bukan sekadar , terdapat tujuh kaedah

. Pertama,
const arrayProto = Array.prototype
export const arrayMethods = Object.create(arrayProto)

const methodsToPatch = [
  &#39;push&#39;,
  &#39;pop&#39;,
  &#39;shift&#39;,
  &#39;unshift&#39;,
  &#39;splice&#39;,
  &#39;sort&#39;,
  &#39;reverse&#39;
]
function def(obj, key, val, enumerable) {
    Object.defineProperty(obj, key, {
        value: val,
        enumerable: !!enumerable,
        writable: true,
        configurable: true
    });
}
methodsToPatch.forEach(function (method) {
  const original = arrayProto[method]
  def(arrayMethods, method, function mutator (...args) {
    const result = original.apply(this, args)
    const ob = this.__ob__
    let inserted
    switch (method) {
      case &#39;push&#39;:
      case &#39;unshift&#39;:
        inserted = args
        break
      case &#39;splice&#39;:
        inserted = args.slice(2)
        break
    }
    if (inserted) ob.observeArray(inserted)
    ob.dep.notify()
    return result
  })
})
Salin selepas log masuk

melaksanakan kaedah tatasusunan asal dan memperoleh nilainya splice Kemudian dinilai bahawa jika nilai ditambahkan pada tatasusunan push、pop、shift、unshift、splice、sort、reverseconst result = original.apply(this, args), nilai yang baru ditambah juga akan menjadi. dilaksanakan ,Langkah terakhirmendapatkan 响应式 tatasusunan ini dan mengedarkan serta mengemas kini dep dalam
. Jika anda ingin mengetahui lebih lanjut tentang responsif Vue, anda boleh menyemak artikel sebelumnya _ob_对象_ob_
Pewawancara bertanya kepada anda tentang prinsip responsif Vue2. Bagaimana anda menjawab? - Nugget (juejin.cn)
Respons pelaksanaan objek

Logik di bahagian bawah digunakan untuk memproses respons objek, mari kita teruskan Lihat

$set Pertama sekali, dinilai bahawa jika atribut dikembalikan secara langsung dalam objek sasaran untuk menamatkan logik,

kerana vue hanya akan kehilangan respons apabila menambah atribut yang bukan pada asalnya dalam objek sasaran
  if (key in target && !(key in Object.prototype)) {
    target[key] = val;
    return val;
  }
  const ob = (target: any).__ob__;
  if (!ob) {
    target[key] = val;
    return val;
  }
  defineReactive(ob.value, key, val);
  ob.dep.notify();
  return val;
Salin selepas log masuk
,


, vue akan menjadikan semua atribut dalam data responsif semasa pemulaan Jika nilai ialah objek atau tatasusunan, tika baharu akan disimpan dalam __ob__ ,
Jika anda ingin mengetahui lebih lanjut tentang responsif Vue, anda boleh menyemak artikel sebelumnya例如 let obj={}  obj.name='ccs'
ObserverPewawancara bertanya kepada anda tentang prinsip responsif Vue2, bagaimana anda menjawab? - Nuggets (juejin.cn) mendapat _ob_ objek ini untuk penghakiman Jika ia tidak wujud, ini bermakna ia adalah
objek biasa yang belum dimulakan oleh vue sebaliknya. daripada Objek respons
, jika tidak, tambahkan kaedah get dan tetapkan kaedah secara manual pada atribut melalui untuk melaksanakan respons , dan kemudian panggil defineReactive secara manual dalam untuk menerbitkan kemas kini.
Ringkasandepnotify()Kaedah $set dalam vue mengendalikan tatasusunan dan objek pada asasnya dengan cara yang sama Ia menambahkan respons kepada nilai baharu dan kemudian mencetuskan kemas kini penghantaran secara manual.

(Mempelajari perkongsian video:

Tutorial pengenalan Vuejs

,

Video pengaturcaraan asas

)

Atas ialah kandungan terperinci Mari kita bincangkan tentang cara $set dilaksanakan dalam Vue?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Perbincangan mendalam tentang cara vite menghurai fail .env Perbincangan mendalam tentang cara vite menghurai fail .env Jan 24, 2023 am 05:30 AM

Apabila menggunakan rangka kerja Vue untuk membangunkan projek bahagian hadapan, kami akan menggunakan berbilang persekitaran apabila digunakan Selalunya nama domain antara muka yang dipanggil oleh pembangunan, ujian dan persekitaran dalam talian adalah berbeza. Bagaimanakah kita boleh membuat perbezaan? Iaitu menggunakan pembolehubah dan corak persekitaran.

Penjelasan grafik terperinci tentang cara mengintegrasikan editor kod Ace dalam projek Vue Penjelasan grafik terperinci tentang cara mengintegrasikan editor kod Ace dalam projek Vue Apr 24, 2023 am 10:52 AM

Ace ialah editor kod boleh terbenam yang ditulis dalam JavaScript. Ia sepadan dengan fungsi dan prestasi penyunting asli seperti Sublime, Vim dan TextMate. Ia boleh dibenamkan dengan mudah ke dalam mana-mana halaman web dan aplikasi JavaScript. Ace dikekalkan sebagai editor utama untuk Cloud9 IDE dan merupakan pengganti kepada projek Mozilla Skywriter (Bespin).

Apakah perbezaan antara komponenisasi dan modularisasi dalam vue Apakah perbezaan antara komponenisasi dan modularisasi dalam vue Dec 15, 2022 pm 12:54 PM

Perbezaan antara komponenisasi dan modularisasi: Modularisasi dibahagikan dari perspektif logik kod; ia memudahkan pembangunan berlapis kod dan memastikan bahawa fungsi setiap modul berfungsi adalah konsisten. Pengkomponenan adalah perancangan dari sudut antara muka UI pemkomponenan bahagian hadapan memudahkan penggunaan semula komponen UI.

Mari kita bercakap secara mendalam tentang reactive() dalam vue3 Mari kita bercakap secara mendalam tentang reactive() dalam vue3 Jan 06, 2023 pm 09:21 PM

Kata Pengantar: Dalam pembangunan vue3, reaktif menyediakan kaedah untuk melaksanakan data responsif. Ini adalah API yang kerap digunakan dalam pembangunan harian. Dalam artikel ini, penulis akan meneroka mekanisme operasi dalamannya.

Terokai cara menulis ujian unit dalam Vue3 Terokai cara menulis ujian unit dalam Vue3 Apr 25, 2023 pm 07:41 PM

Vue.js telah menjadi rangka kerja yang sangat popular dalam pembangunan bahagian hadapan hari ini. Memandangkan Vue.js terus berkembang, ujian unit menjadi semakin penting. Hari ini kita akan meneroka cara menulis ujian unit dalam Vue.js 3 dan menyediakan beberapa amalan terbaik serta masalah dan penyelesaian biasa.

Analisis ringkas tentang cara mengendalikan pengecualian dalam komponen dinamik Vue3 Analisis ringkas tentang cara mengendalikan pengecualian dalam komponen dinamik Vue3 Dec 02, 2022 pm 09:11 PM

Bagaimana untuk mengendalikan pengecualian dalam komponen dinamik Vue3? Artikel berikut akan membincangkan kaedah pengendalian pengecualian komponen dinamik Vue3 Saya harap ia akan membantu semua orang.

Perbandingan mudah sintaks JSX dan sintaks templat dalam Vue (analisis kelebihan dan kekurangan) Perbandingan mudah sintaks JSX dan sintaks templat dalam Vue (analisis kelebihan dan kekurangan) Mar 23, 2023 pm 07:53 PM

Dalam Vue.js, pembangun boleh menggunakan dua sintaks berbeza untuk mencipta antara muka pengguna: sintaks JSX dan sintaks templat. Kedua-dua sintaks mempunyai kelebihan dan kekurangannya sendiri Mari kita bincangkan perbezaan, kelebihan dan kekurangannya.

Analisis ringkas tentang cara vue melaksanakan muat naik menghiris fail Analisis ringkas tentang cara vue melaksanakan muat naik menghiris fail Mar 24, 2023 pm 07:40 PM

Dalam proses projek pembangunan sebenar, kadangkala perlu memuat naik fail yang agak besar, dan kemudian muat naik akan menjadi agak perlahan, jadi latar belakang mungkin memerlukan bahagian hadapan untuk memuat naik hirisan fail Sebagai contoh, 1 A aliran fail gigabait dipotong kepada beberapa aliran fail kecil, dan kemudian antara muka diminta untuk menghantar aliran fail kecil masing-masing.

See all articles