toRaw()、reactive()以及ref和reactive的区别
2023-12-15 15:31:52
<script setup lang="ts">
import {reactive, toRaw, isReactive} from "vue"
const state = { count : 1}
const reactiveState = reactive(state)
console.log( toRaw(reactiveState) === state ) // true
isReactive(toRaw(reactiveState)) // false
</script>
toRaw 根据vue创建的代理返回其原始对象, reactive根据原始对象创建一个vue代理。
在此总结ref与reactive的区别:
1. ref能同时处理基本数据类型和对象,而reactive只能处理对象。
ref是通过一个中间对象RefImpl持有数据,并重写它的set和get方法实现数据劫持的,本质上是通过Object.defineProperty对RefImpl的value属性进行劫持。
reactive则是通过Proxy进行劫持的,Proxy无法对基本数据类型进行操作。
2. ref需要通过value属性间接的访问数据,(在templates中vue做了自动展开),而reactive可以直接访问。
3. 可以给ref的值重新分配给一个新对象,而reactive只能修改当前代理的属性,否则会破坏响应性。
4. ref()在原始数据为Object类型时,会通过reactive包装原始数据后再赋值给_value。
5. watch()默认情况下只监听ref的value,而对reactive执行深度监听。
文章来源:https://blog.csdn.net/content6/article/details/135015458
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!