微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

认真总结Vue3中ref与reactive区别和isRef与isReactive 类型判断

1.什么是ref?

1.ref和reactive-样
也是用来实现响应式数据的方法
由于reactive必须传递一个对象,
所以导致在企业开发中如果我们只想让某个变量实现响应式的时候会非常麻烦
所以Vue3就给我们提供了ref方法,实现对简单值的监听

2.ref本质:
ref底层的本质其实还是reactive
系统会自动根据我们给ref传入的值将它转换成
ref(xx) -> reactive({value:xx})

3.ref注意点:
在Vue的html中使用ref的值不用通过value获取
在JS中使用ref的值必须通过value获取

2.在Vue的html中使用ref的值不用通过value获取

<template>
 <div>
    <div>
      <!--在Vue的html中使用ref的值不用通过value获取  -->
      <li>{{state}}</li>
      <button @click="func1">按钮</button>
    </div>
 </div>
</template>
<script>
import {ref} from 'vue'
export default {
  name: 'App',setup(){
     let state=ref(100);
     function func1(){
        <!-- 在JS中使用ref的值必须通过value获取 -->
       state.value=200
     }
     return {state,func1}
  },}
</script>

3. ref和reactive区别:

区别一:
如果在template里使用的是ref类型的数据,那么Vue会自动帮我们添加.value
如果在template里使用的是reactive类型的数据,那么Vue不会自动帮我们添加.value

区别二:
ref函数只能够去监听简单类型的数据变化,不能够去监听,复杂类型的变化(数组、对象)
reactive函数传递的参数必须是对象(json/arr)

区别三
__v_isRef 是ref中拥有的属性
Vue底层就是根据这个来进判断是否需要在template添加.value的哈
reactive 是没有__v_isRef这个属性的,所以不会帮我们添加.value的

4.ref类型中有__v_isRef 这个属性

<template>
 <div>
    <div>
      <li>{{state}}</li>
       <button @click="func1">按钮</button>
    </div>
 </div>
</template>
<script>
import {ref} from 'vue'
export default {
  name: 'App',setup(){
     let state=ref(100)
     function func1(){
       console.log( 'stateObj下的属性',state );// 有 __v_isRef 这个属性
       state.value=200;
     }
     return {state,}
</script>

5. isRef,isReactive 类型判断

isRef是用来检测ref类型的,如果是返回的是true,否者返回false
isReactive是用来检测reactive类型的,如果是返回的是true,否者返回false
<template>
 <div>
    <div>
      <li>{{state}}</li>
       <button @click="func1">按钮</button>
    </div>
 </div>
</template>
<script>
import {ref} from 'vue'
// 引入,你也可以在上一句中直接导入
import {isRef,isReactive} from 'vue'
export default {
  name: 'App',setup(){
     let state=ref(100)
     function func1(){
       //是否是ref类型的
       console.log(isRef(state));//true

       //是否是reactive类型的
       console.log(isReactive(state));//false
       state.value=200;
     }
     return {state,}
</script>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐