Rumah  >  Artikel  >  hujung hadapan web  >  Apakah kegunaan pembekuan data vue?

Apakah kegunaan pembekuan data vue?

青灯夜游
青灯夜游asal
2023-01-12 18:54:101982semak imbas

Dalam vue, kaedah pembekuan data "Object.freeze()" digunakan untuk membekukan objek, dan dilarang mengubah suai sifat objek (memandangkan tatasusunan juga bersifat objek, kaedah ini boleh digunakan pada tatasusunan). Selepas objek dibekukan, atribut sedia ada tidak boleh dipadamkan, kebolehhitungan, kebolehkonfigurasian dan kebolehtulisan atribut sedia ada objek tidak boleh diubah suai, dan nilai atribut sedia ada tidak boleh diubah suai sebagai tambahan, selepas membekukan objek, objek itu prototaip Ia tidak boleh diubah suai sama ada.

Apakah kegunaan pembekuan data vue?

Persekitaran pengendalian tutorial ini: sistem windows7, versi vue3, komputer DELL G3.

Apabila memperkenalkan pengikatan data dan tindak balas dalam dokumentasi Vue, secara khusus diperhatikan bahawa objek yang melepasi kaedah Object.freeze() tidak boleh bertindak balas kepada kemas kini. Oleh itu, saya secara khusus menyemak maksud khusus kaedah Object.freeze().

Maksud

Kaedah Object.freeze() digunakan untuk membekukan objek dan melarang pengubahsuaian sifat objek (disebabkan 数组本质也是对象, kaedah ini boleh mengubah suai penggunaan tatasusunan). Ia diperkenalkan dalam Mozilla MDN seperti berikut:

boleh membekukan objek. Objek beku tidak boleh diubah suai lagi; jika objek dibekukan, atribut baharu tidak boleh ditambahkan pada objek,

tidak boleh memadamkan atribut sedia ada dan tidak boleh mengubah suai kebolehkonfigurasian, kebolehtulisan objek , dan ketidakupayaan untuk mengubah suai nilai hartanah sedia ada. Selain itu, prototaip objek tidak boleh diubah suai selepas membekukannya

Nilai pulangan kaedah ini ialah parameternya sendiri.

Adalah penting untuk ambil perhatian dua perkara berikut

1 Object.freeze() adalah berbeza daripada pengisytiharan pembolehubah const dan tidak menganggap fungsi const.

const berbeza sama sekali daripada Object.freeze()

  • const berkelakuan seperti let. Satu-satunya perbezaan di antara mereka ialah const mentakrifkan pembolehubah yang tidak boleh ditugaskan semula. Pembolehubah yang diisytiharkan dengan const mempunyai skop blok, bukan skop fungsi seperti pembolehubah yang diisytiharkan dengan var.
  • Object.freeze() menerima objek sebagai parameter dan mengembalikan objek tidak berubah yang sama. Ini bermakna kita tidak boleh menambah, memadam atau menukar sebarang sifat objek.
  • const dan Object.freeze() adalah tidak sama const menghalang pembolehubah daripada diperuntukkan semula, manakala Object.freeze() menjadikan objek tidak berubah.

Kod berikut adalah betul:

Apakah kegunaan pembekuan data vue?

2 Object.freeze() ialah "pembekuan cetek", kod berikut adalah sah:

Apakah kegunaan pembekuan data vue?

Instance

Penggunaan umum

Apakah kegunaan pembekuan data vue?

Jelas sekali, a's The prop attribute tidak diubah, walaupun ia ditugaskan semula.

Sambungan

"Deep Freeze"

Untuk membekukan sepenuhnya objek dengan sifat bersarang, anda boleh menulis perpustakaan anda sendiri atau menggunakan Perpustakaan sedia ada untuk membekukan objek, seperti Deepfreeze atau immutable-js

// 深冻结函数.
function deepFreeze(obj) {

  // 取回定义在obj上的属性名
  var propNames = Object.getOwnPropertyNames(obj);

  // 在冻结自身之前冻结属性
  propNames.forEach(function(name) {
    var prop = obj[name];

    // 如果prop是个对象,冻结它
    if (typeof prop == 'object' && prop !== null)
      deepFreeze(prop);
  });

  // 冻结自身(no-op if already frozen)
  return Object.freeze(obj);
}

sebenarnya merupakan kaedah rekursif yang mudah. Tetapi ia melibatkan titik pengetahuan yang sangat penting tetapi jarang digunakan semasa menulis logik perniagaan Object.getOwnPropertyNames(obj) . Kita semua tahu bahawa terdapat sifat rantai prototaip dalam Objek JS, dan semua sifat rantai bukan prototaip boleh diperoleh melalui kaedah ini.

Gunakan Object.freeze() untuk meningkatkan prestasi

Selain pengoptimuman komponen, kita juga boleh bermula dengan transformasi pergantungan vue. Semasa pemulaan, Vue akan melakukan transformasi getter dan setter pada data Dalam pelayar moden, proses ini sebenarnya agak pantas, tetapi masih ada ruang untuk pengoptimuman.

Object.freeze() Anda boleh membekukan objek Selepas membekukan, anda tidak boleh menambah atribut baharu pada objek, mengubah suai nilai atribut sedia ada, memadamkan atribut sedia ada dan mengubah suai atribut sedia ada objek. Kebolehbilangan, kebolehkonfigurasian dan kebolehtulisan. Kaedah ini mengembalikan objek beku.

Apabila anda menghantar objek JavaScript biasa ke pilihan data bagi contoh Vue, Vue akan mengulangi semua sifat objek dan menggunakan Object.defineProperty untuk menukar semua sifat ini kepada Getters/setter, getter/setter ini tidak kelihatan kepada pengguna, tetapi secara dalaman mereka membenarkan Vue menjejak kebergantungan dan memberitahu perubahan apabila sifat diakses dan diubah suai.

但 Vue 在遇到像 Object.freeze() 这样被设置为不可配置之后的对象属性时,不会为对象加上 setter getter 等数据劫持的方法。参考 Vue 源码

Vue observer 源码

Apakah kegunaan pembekuan data vue?

性能提升效果对比

在基于 Vue 的一个 big table benchmark 里,可以看到在渲染一个一个 1000 x 10 的表格的时候,开启Object.freeze() 前后重新渲染的对比。

big table benchmark

Apakah kegunaan pembekuan data vue?

开启优化之前

Apakah kegunaan pembekuan data vue?

开启优化之后

Apakah kegunaan pembekuan data vue?

在这个例子里,使用了 Object.freeze()比不使用快了 4 倍

为什么Object.freeze() 的性能会更好

不使用Object.freeze() 的CPU开销

Apakah kegunaan pembekuan data vue?

使用 Object.freeze()的CPU开销

Apakah kegunaan pembekuan data vue?

对比可以看出,使用了 Object.freeze() 之后,减少了 observer 的开销。

Object.freeze()应用场景

由于 Object.freeze()会把对象冻结,所以比较适合展示类的场景,如果你的数据属性需要改变,可以重新替换成一个新的 Object.freeze()的对象。

Javascript对象解冻

修改 React props React生成的对象是不能修改props的, 但实践中遇到需要修改props的情况. 如果直接修改, js代码将报错, 原因是props对象被冻结了, 可以用Object.isFrozen()来检测, 其结果是true. 说明该对象的属性是只读的.

那么, 有方法将props对象解冻, 从而进行修改吗?

事实上, 在javascript中, 对象冻结后, 没有办法再解冻, 只能通过克隆一个具有相同属性的新对象, 通过修改新对象的属性来达到目的.

可以这样:

ES6: Object.assign({}, frozenObject);
lodash: _.assign({}, frozenObject);

来看实际代码:

function modifyProps(component) {
  let condictioin = this.props.condictioin,
    newComponent = Object.assign({}, component),
    newProps = Object.assign({}, component.props)
  
  if (condictioin) {
    if (condictioin.add) newProps.add = true
    if (condictioin.del) newProps.del = true
  }
  newComponent.props = newProps
  
  return newComponent
}

锁定对象的方法

  • Object.preventExtensions()

no new properties or methods can be added to the project 对象不可扩展, 即不可以新增属性或方法, 但可以修改/删除

  • Object.seal()

same as prevent extension, plus prevents existing properties and methods from being deleted 在上面的基础上,对象属性不可删除, 但可以修改

  • Object.freeze()

same as seal, plus prevent existing properties and methods from being modified 在上面的基础上,对象所有属性只读, 不可修改

以上三个方法分别可用Object.isExtensible(), Object.isSealed(), Object.isFrozen()来检测

Object.freeze( ) 阻止Vue无法实现 响应式系统

当一个 Vue 实例被创建时,它向 Vue 的响应式系统中加入了其 data 对象中能找到的所有的属性。当这些属性的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。但是如果使用 Object.freeze(),这会阻止修改现有的属性,也意味着响应系统无法再追踪变化。

具体使用办法举例:

<template>
  <div>
     <p>freeze后会改变吗
        {{obj.foo}}
     </p>
      <!-- 两个都不能修改??为什么?第二个理论上应该是可以修改的-->
      <button @click="change">点我确认</button>
  </div>
</template>

<script>
var obj = {
  foo: &#39;不会变&#39;
}
Object.freeze(obj)
export default {
  name: &#39;index&#39;,
  data () {
    return {
      obj: obj
    }
  },
  methods: {
    change () {
      this.obj.foo = &#39;改变&#39;
    }
  }
}
</script>

运行后:

Apakah kegunaan pembekuan data vue?

从报错可以看出只读属性foo不能进行修改,Object.freeze()冻结的是值,你仍然可以将变量的引用替换掉,将上述代码更改为:

<button @click="change">点我确认</button>

change () {
      this.obj = {
        foo: &#39;会改变&#39;
      }
    }

Object.freeze()是ES5新增的特性,可以冻结一个对象,冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。防止对象被修改。 如果你有一个巨大的数组或Object,并且确信数据不会修改,使用Object.freeze()可以让性能大幅提升。

实践心得和技巧

Object.freeze()是ES5新增的特性,可以冻结一个对象,防止对象被修改。

vue 1.0.18+对其提供了支持,对于data或vuex里使用freeze冻结了的对象,vue不会做getter和setter的转换。

如果你有一个巨大的数组或Object,并且确信数据不会修改,使用Object.freeze()可以让性能大幅提升。在我的实际开发中,这种提升大约有5~10倍,倍数随着数据量递增。

并且,Object.freeze()冻结的是值,你仍然可以将变量的引用替换掉。举个例子:

<p v-for="item in list">{{ item.value }}</p>
new Vue({
    data: {
        // vue不会对list里的object做getter、setter绑定
        list: Object.freeze([
            { value: 1 },
            { value: 2 }
        ])
    },
    created () {
        // 界面不会有响应
        this.list[0].value = 100;

        // 下面两种做法,界面都会响应
        this.list = [
            { value: 100 },
            { value: 200 }
        ];
        this.list = Object.freeze([
            { value: 100 },
            { value: 200 }
        ]);
    }
})

vue的文档没有写上这个特性,但这是个非常实用的做法,对于纯展示的大数据,都可以使用Object.freeze提升性能。

(学习视频分享:vuejs入门教程编程基础视频

Atas ialah kandungan terperinci Apakah kegunaan pembekuan data vue?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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