vue中reactive,ref相关api总结

x33g5p2x  于2022-02-14 转载在 Vue.js  
字(2.8k)|赞(0)|评价(0)|浏览(434)

vue3composition api中的reactiveref存在一些其他api。下面我们进行总结。
一、Reactive判断api
isProxy:判断对象是否由reactive或者readonly创建的对象。

  1. //判断reactive
  2. const info = reactive({ name: "dmc", age: 20 });
  3. console.log(isProxy(info)) //true
  4. //判断readonly
  5. const info = readonly({ name: "dmc", age: 20 });
  6. console.log(isProxy(info)) //true

isReactive:检查对象是否是reactive创建的响应式代理

  1. const info = reactive({ name: "dmc", age: 20 });
  2. console.log(isReactive(info)) //true
  3. //即使在readonly外层包裹reactive也是可以的。
  4. const info = reactive({ name: "dmc", age: 20 });
  5. console.log(isReactive(info)) //true
  6. //其代理为readonly创建的,但是其内部为reactive创建的,打印结果为true,反之为false.
  7. const info = reactive({name:"zs"})
  8. const set = readonly(info)
  9. console.log(isReactive(set)) //true

isReadonly:检查对象是否由readonly创建的代理

  1. const info = readonly({name:"zs"})
  2. console.log(isReadonly(info)) //true

toRaw:返回reactive和readonly代理的原始对象

  1. const info = readonly({name:"zs"})
  2. console.log(toRaw(info)) // {name:"zs"}

shallowReactive:只进行对象浅层次的响应式,深层次的还是原生对象。

  1. let info = shallowReactive({ info: { counter: 1 }, age: 20 });
  2. 当我们改变age的值时,页面会进行重新渲染,当我们改变counter的值时,不会进行页面的重新渲染。

shallowReadonly:只进行对象浅层次的只读设置,深层次仍然是原生对象,可以读写。

  1. const info = shallowReadonly(
  2. {
  3. baseInfo: { name: "dmc", age: 20 },
  4. scores: 100,
  5. });
  6. 如上面代码所示,此时改变scores的值会报出warning,当改变baseInfo中的age值时,页面不会
  7. 发生更新,因为此时baseInfo中的对象是普通对象,而不是响应式对象。

二、ref相关api
toRefs

  1. let info = reactive({ name: "XSY", age: 20 });
  2. return {
  3. ...info
  4. }

此时我们使用reactive来设置响应式对象时,此时返回的解构对象不是响应式的,我们可以使用toRefs来解决。

  1. let info = reactive({name:"xsy", age:20})
  2. return {
  3. ...toRefs(info)
  4. }
  5. 此时就相当于对info解构后的内容进行设置ref响应式

toRef

  1. import { reactive, toRef } from "vue";
  2. export default {
  3. setup() {
  4. const info = reactive({ name: "dmc", age: 200 });
  5. let age = toRef(info, "age")
  6. //toRef第一个参数是reactive对象,第二个参数是属性
  7. //表示从该响应式对象中取出age属性并将其转化为ref对象
  8. let {name} = info
  9. const changeAge = () => {
  10. age.value++ //age为ref对象
  11. };
  12. const changeName = () => {
  13. name= "dddd"; //这里不加value,因为其不是ref对象
  14. };
  15. return {
  16. age,
  17. name,
  18. changeName,
  19. changeAge,
  20. };
  21. },
  22. };

ref的其他api
unref:将取出ref中的value值,如果是普通值,则直接返回。

  1. const age = ref(20)
  2. console.log(age.value) //20
  3. console.log(unref(age)) //20
  4. //其内部可以表示为:
  5. //val = isRef(val)? val.value: val

isRef:判断一个对象是否是一个ref对象

  1. const age = ref(20)
  2. console.log(isRef(age)) //true

shallowRef:创建浅层的ref对象

  1. import { ref } from 'vue'
  2. export default {
  3. setup() {
  4. const info = ref({name:"sx", age:2})
  5. const changeAge = () => {
  6. info.value.age++
  7. }
  8. return {
  9. info,
  10. changeAge
  11. }
  12. }
  13. }
  14. 此时当改变age中的值时,会发生页面的改变。
  1. import { ref, shallowRef } from 'vue'
  2. export default {
  3. setup() {
  4. const info = shallowRef({name:"sx", age:2})
  5. const changeAge = () => {
  6. info.value.age++
  7. console.log(info.value)
  8. }
  9. return {
  10. info,
  11. changeAge
  12. }
  13. }
  14. }
  15. 此时当改变age的值时,不会发生页面的改变。

triggerRef:手动触发和shallowRef相关联的副作用。

  1. import { ref, shallowRef, triggerRef } from 'vue'
  2. export default {
  3. setup() {
  4. const info = shallowRef({name:"sx", age:2})
  5. const changeAge = () => {
  6. info.value.age++
  7. console.log(info.value)
  8. triggerRef(info) //加上triggerRef就能改变页面中的内容
  9. }
  10. return {
  11. info,
  12. changeAge
  13. }
  14. }
  15. }

相关文章

最新文章

更多