需求:
后端返回的数据是一个嵌套式数据(info),这些数据都需要在页面上进行渲染、修改; ->将其定义为一个响应式数据return出去;
但是呢有的数据使用比较频繁,比如 name(简单数据类型),soninfo(引用数据类型); 为了更方便使用 -> 定义为一个变量return出去
html
<template>
<div>为了测试展示全部信息->{{info}}</div>
<h1>name:{{name}}</h1>
<h1>sonname:{{soninfo.name}}</h1>
<button @click="name+='~'">点我修改info.name</button>
<button @click="soninfo.name += '~'">点我修改soninfo.name</button>
</template>
js1
<script>
import {reactive} from 'vue'
export default{
setup(){
// 将后端返回得数据定义为一个响应死数据
let info=reactive({
name:'xiangxiang',
age:'48',
soninfo:{
name:'niuniu',
age:24,
grandinfo:{
name:'hengheng',
age:2
}
}
})
// 采用直接赋值的形式定义一个变量
let name = info.name
let soninfo = info.soninfo
return{
info,
name:name,
soninfo:soninfo
}
}
}
</script>
初次渲染没有问题;
当 点击“点我修改info.name”按钮时 页面内容无变化(即使数据已经改变了);
当 点击“点我修改soninfo.name”按钮时。页面内容能正常渲染;
采用直接赋值形式,为什么简单数据类型不能正常修改,而引用类型却可以正常修改呢?
// 定义一个变量
let name = info.name
console.log(name) // 'xiangxiang'
let soninfo = info.soninfo
console.log(soninfo) // Proxy {name: 'niuniu', age: 24, grandinfo: {…}}
如果想要简单数据类型赋值应该怎样才能获取一个响应式数据呢?
—> 使用组合APItoRef函数
// 引入
import {reactive,toRef} from 'vue'
// 使用
let 变量名 = toRef(reactive对象,属性名)
创建一个 ref 对象
,其value值指向另一个对象中的某个属性
;
当要将响应式对象中的某个值为简单数据
类型的属性单独提供给外部使用时就使用toRef;
导入中的例子使用toRef就可以实现了
<template>
<div>为了测试展示全部信息->{{info}}</div>
<h1>name:{{name}}</h1>
<h1>sonname:{{soninfo.name}}</h1>
<button @click="name+='~'">点我修改info.name</button>
<button @click="soninfo.name += '~'">点我修改soninfo.name</button>
</template>
<script>
import {reactive,toRef} from 'vue'
export default{
setup(){
let info=reactive({
name:'xiangxiang',
age:'48',
soninfo:{
name:'niuniu',
age:24,
grandinfo:{
name:'hengheng',
age:2
}
}
})
// 定义一个变量
let name = toRef(info,'name')
let soninfo = info.soninfo
return{
info,
name:name,
soninfo:soninfo
}
}
}
</script>