美文网首页
(五)响应式数据对象 - reactive

(五)响应式数据对象 - reactive

作者: Mr_莫言之 | 来源:发表于2020-10-16 13:10 被阅读0次
本章将介绍到的是使用reactive来创建组件实例中的响应式数据对象。

1、概述:函数,创建一个响应式数据对象,响应式会影响到所有的子集嵌套;
2、用例:由vue提供,按需引入:import { reactive } from 'vue';

<template>
    <p>{{user.name}}</p>
</template>

<script>
    import { reactive } from 'vue';
    export default {
        setup() {
            const user = reactive({ name: 'li_si', age: 20 });
           return { user };
        }
    }
</script>
下面是reactive数据能访问到的部分常用方法及延伸方法。

readonly()

1、概述:创建一个只读代理,且原始对象的任何嵌套属性也将是只读的
2、用例:由vue提供,按需引入:import { readonly } from 'vue';
3、对普通变量创建只读:

<script>
    import { readonly } from 'vue';
    export default {
        setup() {
            const user = { name: 'li_si', age: 20 };
            const copy = readonly(user);
            return { copy };
        }
    }
</script>

copy.age++ // warning! target is readonly.

4、对reactive创建只读:

<script>
    import { reactive, readonly } from 'vue';
    export default {
        setup() {
            const user = reactive({ name: 'li_si', age: 20 });
            const copy = readonly(user);
            return { user };
        }
    }
</script>

user.age++ // age: 21
copy.age++ // warning! target is readonly.

isProxy()

1、概述:判读对象是否由reactive创建或者是readonly创建的代理。
2、用例:由vue提供,按需引入:import { isProxy } from 'vue';

import { ref, reactive, readonly, isProxy } from 'vue';

// ref创建
const refVal = ref(123);
isProxy(refVal) // false

// reactive创建
const reactiveVal = reactive({ age: 20 });
isProxy(reactiveVal) // true

// readonly代理
const readonlyVal = readonly(reactiveVal);
isProxy(readonlyVal) // true

// 普通变量
const defaultVal = 'default';
isProxy(defaultVal) // false

isReactive()

1、概述:检查对象是否由reactive创建
2、用例:由vue提供,按需引入:import { isReactive } from 'vue';

import { reactive, isReactive } from 'vue'
export default {
  setup() {
    const state = reactive({ name: 'zhang_san'});
    console.log(isReactive(state)) // true
  }
}

还能判断readonly代理的对象是否是由reactive创建

import { reactive, isReactive, readonly } from 'vue'
export default {
  setup() {
    const state = reactive({ name: 'zhang_san' });
    // 创建普通只读代理
    const plain = readonly({ name: 'li_si' });
    console.log(isReactive(plain)) // false
    // 创建reactive只读代理
    const stateCopy = readonly(state)
    console.log(isReactive(stateCopy)) // true
  }
}

isReadonly()

1、概述:检查代理是否由readonly创建
2、用例:由vue提供,按需引入:import { isReadonly } from 'vue';

import { reactive, readonly, isReadonly } from 'vue'
const reactiveVal = reactive({ name: 'zhang_san' });
const copy = readonly(reactiveVal);
console.log(isReadonly(copy)) // true

toRaw()

1、概述:返回reactive或者是readonly代理的原始对象
2、用例:由vue提供,按需引入:import { toRaw } from 'vue';

import { toRaw, reactive, readonly, isProxy } from 'vue';
const user = {}
const reactiveUser = reactive(user);
const readonlyUser = readonly(reactiveUser);

console.log(toRaw(reactiveUser) === user) // true
console.log(toRaw(readonlyUser) === user) // true
console.log(isProxy(toRaw(reactiveUser))) // false
console.log(isProxy(toRaw(readonlyUser))) // false

markRaw()

1、概述:标记一个对象,被标记后,该对象永远不会被转换为代理
2、用例:由vue提供,按需引入:import { markRaw } from 'vue';

import { markRaw, reactive, isReactive } from 'vue';
const user = markRaw({});
const reactiveUser = reactive(user);
console.log(isReactive(reactiveUser)) // false

const reactiveUser1 = reactive({ user });
console.log(isProxy(toRaw(reactiveUser1))) // true 
console.log(isProxy(toRaw(reactiveUser1.user))) // false
// 在reactive创建代理时,被markRaw标记的嵌套对象不会被reactive创建代理

shallowReactive()

1、概述:创建一个反应式代理,但是只是浅度创建。
2、用例:由vue提供,按需引入:import { shallowReactive } from 'vue';

import { isReactive, shallowReactive } from 'vue';
const data = shallowReactive({
    count: 10,
    content: {
        age: 20
    }
})
data.count++ // 11 逻辑层数据已发生变化,视图重新渲染
isReactive(data.content) // false 因为data.content属于深度嵌套,未被代理
data.content.age++ // 21 逻辑层数据已发生变化,但是视图层不会被更新渲染

shallowReadonly()

1、概述:创建一个只读代理,但是只是浅度创建。
2、用例:由vue提供,按需引入:import { shallowReadonly } from 'vue';

import { isReadonly, shallowReadonly } from 'vue';
const data = shallowReadonly({
    count: 10,
    content: {
        age: 20
    }
})
data.count++ // warning! target is readonly.
isReadonly(data.content) // false 因为data.content属于深度嵌套,未被代理
data.content.age++ // 21 深度嵌套未被代理,所以操作成功。

reactive和ref的相互作用

1、将ref的数据对象挂载到reactive上时,会把原始的响应数据对象展开为原始值,这样就不需要.value而被直接访问到。

setup() {
    const ref1 = ref(0);
    const reative1 = reactive({ref1});
    console.log(reative1.ref1); // 0
    reative1.ref1 ++;
    console.log(reative1.ref1); // 1
    console.log(ref1.value); // 1
}

2、新的ref会覆盖旧的ref

setup() {
    const ref1 = ref(0);
    const reative = reactive({ref1});
    
    const ref2 = ref(100);
    reative.ref1 = ref2;
    reative.ref1 ++;
    
    console.log(reative.ref1); // 101
    console.log(ref2.value); // 101
    console.log(ref1.value); // 0
};

下一章:(六)响应式数据 - ref
上一章:(四)setup

ps:成熟的标志不是年龄,而是肩上的责任。

相关文章

  • (五)响应式数据对象 - reactive

    本章将介绍到的是使用reactive来创建组件实例中的响应式数据对象。 1、概述:函数,创建一个响应式数据对象,响...

  • vue3较vue2的特别之处 - ref/toRef/toRef

    ref: 为值类型数据添加响应式状态示例: reactive: 为对象添加响应式状态示例: toRef: 用于为源...

  • ref、reactive、toRef、toRefs使用与区别

    reactive只能传入对象传参:reactive(arg)arg为普通对象返回响应式对象,不管层级多深,都能响应...

  • Vue3.0 ref、reactive、toRef、toRefs

    一、reactive reactive 用于为对象添加响应式状态。接收一个js对象作为参数,返回一个具有响应式状态...

  • ref,shallowRef,reactive,shallowR

    一、reactive和shallowReactive reactive用来创建响应式对象,它接收一个对象/数组参数...

  • vue3 学习

    什么是ref? ref和reactive一样,也是用来实现响应式数据的方法,由于reactive必须传递一个对象,...

  • ref/reactive

    1.reactive reactive能够将一个对象经过proxy代理后成为响应式对象返回 1.1语法 react...

  • RxSwift 学习(一)-- 初探

    一、函数响应式编程(FRP) 响应式编程 简称 RP(Reactive Programming),它是一种面向数据...

  • vue3

    reactive响应式1.对象类型 2基本类型 defineProps defineEmits

  • vue3.0-响应性基础API

    reactive返回对象的响应式副本 响应式转换是“深层”的——它影响所有嵌套 property。在基于 ES20...

网友评论

      本文标题:(五)响应式数据对象 - reactive

      本文链接:https://www.haomeiwen.com/subject/gijwpktx.html