1. ref函数
因为在setup中返回的数据不是响应式的, 这时候就需要ref来定义响应式数据。
ref的作用: 定义一个响应式的数据。
1.1 步骤:
从vue框架中导入ref函数
在setup函数中调用ref函数并传入数据(简单类型或者复杂类型的数据)
在setup函数中把ref函数调用完毕的值以对象的形式返回出去。
1.2 语法:
const num= ref(100)
创建一个包含响应式数据的引用对象(reference对象, 简称ref对象)
JS中的操作数据: num.value
模板中读取数据: 不需要.value, 直接{{num}}
1.3 备注:
接收的数据可以是:基本类型、也可以式对象类型
基本类型的数据:响应式依靠的式类上的getter与setter完成的
对象类型的数据:内部求助了Vue3.0中的一个新函数——reactive函数
<template>
<h2>姓名:{{name}}</h2>
<h2>年龄:{{age}}</h2>
<button @click="changeName">修改姓名</button>
<button @click="changeAge">修改年龄</button>
<hr>
<hr>
<h2>职位:{{job.name}}</h2>
<h2>薪水:{{job.salery}}</h2>
<button @click="changeJobName">修改职位</button>
<button @click="changeSalery">修改薪资</button>
</template>
<script>
import { ref} from'vue'
export default {
setup() {
let name = ref('IRIC')
let age = ref(20)
function changeName(){
name.value += '!'
}
function changeAge(){
age.value ++
}
let job = ref({
name:'web前端工程师',
salery:'20K'
})
function changeJobName(){
job.value.name+= 'haha'
}
function changeSalery(){
job.value.salery += 10
}
return { name, age, changeName, changeAge, job, changeJobName, changeSalery}
},
}
</script>
通过看源码可以知道调用ref会返回一个RefImpl的实例对象,RefImpl类中有getter和setter可以检测到数据的变化
function ref(value) {
return createRef(value, false);
}
function createRef(rawValue, shallow) {
if (isRef(rawValue)) {
return rawValue;
}
return new RefImpl(rawValue, shallow);
}
class RefImpl {
constructor(value, _shallow) {
this._shallow = _shallow;
this.dep = undefined;
this.__v_isRef = true;
this._rawValue = _shallow ? value : toRaw(value);
this._value = _shallow ? value : convert(value);
}
get value() {
trackRefValue(this);
return this._value;
}
set value(newVal) {
newVal = this._shallow ? newVal : toRaw(newVal);
if (hasChanged(newVal, this._rawValue)) {
this._rawValue = newVal;
this._value = this._shallow ? newVal : convert(newVal);
triggerRefValue(this, newVal);
}
}
}
2. reactive函数
- ref函数定义的响应式数据在代码中使用要加.value,不是很方便,这时候我们可以使用reactive定义响应式数据。
reactive是一个函数,它可以定义一个复杂数据类型,成为响应式数据。
2.1 使用步骤
导入:从vue框架中导入reactive函数
- 调用:在setup函数中调用reactive函数并将对象数据传入
- 导出:在setup函数中把reactive函数调用完毕之后的返回值以对象的形式返回出去
2.2 代码
```javascript{{person.name}}
{{person.age}}
{{person.sex}}
```