[vue3] 定义响应式数据的多种方式及分析

472 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

  • ref

    • 定义基本类型的响应式数据,原理通过Object.defineProperty()getset完成的。(对象类型不要用它,要用reactive函数)
  • reactive

    • 定义一个对象类型的响应式数据(基本类型不要用它,要用ref函数)
  • shallowReactive

    • 只处理对象最外层属性的响应式(浅响应式)
  • shallowRef

    • 只处理基本数据类型的响应式, 不进行对象的响应式处理
  • readonly

    • 让一个响应式数据变为只读的(深只读)
    • 应用场景: 不希望数据被修改时
  • shallowReadonly

    • 让一个响应式数据变为只读的(浅只读)
    • 应用场景: 不希望数据被修改时
  • toRaw

    • 作用:将一个由reactive生成的响应式对象转为普通对象
    • 应用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新。
  • markRaw

    • 作用:标记一个对象,使其永远不会再成为响应式对象。
    • 应用场景:
      • 有些值不应被设置为响应式的,例如复杂的第三方类库等。
      • 当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能。 v-model 数据的双向绑定 在原生表中(最简单的实现方法)
<input type="text" v-model="name">

原理 先给input绑定value属性值为数据name 给input绑定input事件将其input的value值赋给数据name 第一种写法:

<input type="text" :value="name" @input="name=$event.target.value">

第二种写法:

<input type="text" :value="name" @input="change">
<script>
    let app = new Vue({
            el: '#app',
            data: {
                message: 'Hello'
            },
            methods: {
            change(event) {
                this.message = event.target.value;
            }
        }
    })
</script

v-model底层原理实际上是分别利用了v-bind用来绑定value的值,用v-on去绑定input标准事件,这是事件用来监听当输入域内容发生变化的时候来执行一些事情。具体做的事情就是通过$event这个事件对象获取到最新的输入域的值,然后把最新的值赋值给旧的值,从而进行数据的更新。这样的话就完成了双向数据绑定。