ref,reactive toRaw
创始人
2024-05-22 13:40:44
0

ref()

在vue3.0引入了composition API , setup函数是其核心函数

在setup函数中,可以使用ref函数,用于创建一个响应式数据,当数据发生改变时,Vue会自动更新UI

例如:使用ref函数定义一个变量count

import { ref } from 'vue';

function useChangeCount() {

let count = ref(0);

function change_count() {

count.value += 1;

}

return { count, change_count }

}

export default useChangeCount;

然后在组件中引入该模块:import useChangeCount from "./composition_tiny_js/count"

并且在组件的setup中使用,并通过return的形式将外界需要用到的变量和函数暴露出去

setup() {

let { count, change_count } = useChangeCount();

return { count, change_count };

}

这样上面暴露的count变量,change_count方法就可以在外界使用了

需要注意的是:

  1. 在setup中定义的变量或方法,都必须通过return {xxx,xxx}暴露出去,外界才能使用

  1. ref函数仅能监听基本类型的变化,不能监听复杂类型的变化(比如对象、数组 [ 详见reactive() ])

reactive()

reactive创建响应式对象,将数据变成响应式数据,当数据发生变化时UI也会自动更新。

reactive的用法与ref的用法相似,不同的是ref用于基本数据类型,而reactive是用于复杂数据类型,比如对象和数组。

setup() {

const form = reactive({

oldPassword: '',

newPassword: '',

...

})

return {

form

}

},

ref 和 reactive 定义响应式数据的区别

  1. ref允许我们创建一个任意类型的响应式的ref对象,在使用时需要带上.value

  1. 模板中使用ref对象时,假如ref位于顶层,就不需要使用value,它会自动解包

  1. 但如果ref对象是作为一个属性声明于对象之中,在模板中进行运算时仍然要使用.value

  1. 通常使用reactive()来创建一个响应式的对象或数组,这样的对象或数组状态都是默认深层响应式的,无论嵌套多深,都能跟踪到。

  1. 但他也有局限性,就是只对 对象类型有效,对基本数据类型无效

  1. 并且假如用一个新对象替换了原来的旧对象,那么原来的旧对象会失去响应性

两者区别:

1、ref多用来定义基本数据类型(也可以定义对象,内部会自动通过reactive转为代理对象),而 reactive只能用来定义对象数组类型

2、ref操作数据需要.value,reactive操作数据不需要.value

3、ref通过Object.defineProperty()的get和set来实现响应式, reactive通过Proxy来实现响应式,并通过Reflect操作源对象内部的数据

toRaw()

reactive存值

let obj = { name: "aa", age: 18 };

let state = reactive(obj);

console.log(obl === state) false

state 和 obj的关系

state 和 obj是引用关系,state的本质是一个Proxy对象,在这个Proxy对象中引用了obj

toRaw()获取值

  • 如果想通过toRaw拿到ref类型的原始数据(创建时传入的那个数据)

  • 必须明确的告诉toRaw方法,要获取的是.value的值

  • 因为经过Vue处理之后,.value中保存的才是当初创建时传入的那个原始数据

isRef,isReactive

  • isRef: 检查一个值是否为一个 ref 对象

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

  • isReadonly: 检查一个对象是否是由 readonly 创建的只读代理

  • isProxy: 检查一个对象是否是由 reactive 或者 readonly 方法创建的代理

// isRef: 检查一个值是否为一个 ref 对象

console.log(isRef(ref({}))); // true

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

console.log(isReactive(reactive({}))); // true

// isReadonly: 检查一个对象是否是由 readonly 创建的只读代理

console.log(isReadonly(readonly({}))); // true

// isProxy: 检查一个对象是否是由 reactive 或者 readonly 方法创建的代理

console.log(isProxy(readonly({}))); // true

console.log(isProxy(reactive({}))); // true

相关内容

热门资讯

润禾材料涨2.27%,成交额1... 5月12日,润禾材料盘中上涨2.27%,截至09:35,报39.18元/股,成交1948.55万元,...
众源新材涨2.04%,成交额1... 5月12日,众源新材盘中上涨2.04%,截至09:40,报10.02元/股,成交1926.44万元,...
浔兴股份跌2.54%,成交额1... 5月12日,浔兴股份(维权)盘中下跌2.54%,截至09:41,报9.20元/股,成交1.01亿元,...
突发!金价大跌,A股港股高开!... 每经编辑|毕陆名 刚刚过去的这个周末,大事频发,随着中美贸易谈判出现积极进展、印巴...
捷强装备跌2.15%,成交额7... 5月12日,捷强装备盘中下跌2.15%,截至09:35,报29.58元/股,成交7273.96万元,...
厚普股份涨2.06%,成交额2... 5月12日,厚普股份盘中上涨2.06%,截至09:40,报9.91元/股,成交2302.99万元,换...
东芯股份涨2.01%,成交额5... 5月12日,东芯股份盘中上涨2.01%,截至09:40,报32.52元/股,成交5488.77万元,...
菲利华涨2.01%,成交额72... 5月12日,菲利华盘中上涨2.01%,截至09:42,报48.75元/股,成交7210.29万元,换...
富满微涨2.01%,成交额23... 5月12日,富满微盘中上涨2.01%,截至09:41,报30.41元/股,成交2314.82万元,换...
5月12日人民币对美元中间价报... 中新网5月12日电 据中国外汇交易中心网站消息,中国人民银行授权中国外汇交易中心公布,2025年5月...
梦洁股份跌2.07%,成交额1... 5月12日,梦洁股份(维权)盘中下跌2.07%,截至09:42,报3.79元/股,成交1906.76...
盛泰集团跌2.02%,成交额1... 5月12日,盛泰集团盘中下跌2.02%,截至09:41,报6.30元/股,成交1688.14万元,换...
普利退涨2.67%,成交额24... 5月12日,普利退(维权)盘中上涨2.67%,截至09:42,报0.77元/股,成交246.72万元...
西部超导涨2.00%,成交额8... 5月12日,西部超导盘中上涨2.00%,截至09:41,报50.90元/股,成交8972.82万元,...
锂电池ETF(561160)开... 5月12日,锂电池ETF(561160)开盘涨1.27%,报0.479元。锂电池ETF(561160...
中药50ETF(562390)... 5月12日,中药50ETF(562390)开盘涨0.32%,报0.952元。中药50ETF(5623...
新能源车龙头ETF(15963... 5月12日,新能源车龙头ETF(159637)开盘涨0.66%,报0.611元。新能源车龙头ETF(...
机床ETF(159663)开盘... 5月12日,机床ETF(159663)开盘涨0.90%,报1.122元。机床ETF(159663)重...
碳中和龙头ETF(159640... 5月12日,碳中和龙头ETF(159640)开盘涨0.54%,报0.742元。碳中和龙头ETF(15...
交运ETF(159662)开盘... 5月12日,交运ETF(159662)开盘涨0.20%,报0.991元。交运ETF(159662)重...