在开发时,有时候会遇到,使用toRef和使用ref的页面效果一样。
代码如下:
<template>
<div>
<h1>姓名:{{name}}</h1>
<h1>年龄:{{age}}</h1>
<h1>薪资:{{salary}}K</h1>
<div>
<button @click="name+='-'">修改姓名</button>
<button @click="age++">修改年龄</button>
<button @click="salary+=10">修改薪资</button>
</div>
</div>
</template>
<script>
import {ref,reactive,toRef,toRefs} from 'vue'
export default {
name: "Demo2",
setup(){
let obj = reactive({
name:'孙悟空',
age:99,
job:{
j1:{
salary:20
}
}
});
let name = obj.name
console.log(`我是name`,name);
let name1 = toRef(obj,"name")
console.log(`我是name1`,name1);
return {
name:ref(obj.name),
age:ref(obj.age),
salary:ref(obj.job.j1.salary),
}
}
}
</script>
<style scoped>
</style>
使用ref,页面上的数据依旧是响应式的。
但是这里有一个坑,使用ref,它只有创建的时候读取了obj里面的数据。之后修改的数据都是ref创建出来的属性。
验证一下,在页面中渲染出obj。进行对比
代码:
<template>
<div>
{{obj}}
<h1>姓名:{{name}}</h1>
<h1>年龄:{{age}}</h1>
<h1>薪资:{{salary}}K</h1>
<div>
<button @click="name+='-'">修改姓名</button>
<button @click="age++">修改年龄</button>
<button @click="salary+=10">修改薪资</button>
</div>
</div>
</template>
<script>
import {ref,reactive,toRef,toRefs} from 'vue'
export default {
name: "Demo2",
setup(){
let obj = reactive({
name:'孙悟空',
age:99,
job:{
j1:{
salary:20
}
}
});
let name = obj.name
console.log(`我是name`,name);
let name1 = toRef(obj,"name")
console.log(`我是name1`,name1);
return {
obj,
name:ref(obj.name),
age:ref(obj.age),
salary:ref(obj.job.j1.salary),
}
}
}
</script>
<style scoped>
</style>
效果图:
name:ref(obj.name),相当于读取了孙悟空这个字符串,把它打包成了一个新的ref对象。源数据丝毫不变。
以上就是ref以及toRef的区别。