1. ref和reactive區別: 如果在template里使用的是ref類型的數據, 那么Vue會自動幫我們添加.value 如果在template里使用的是reactive類型的數據, 那么Vue不會自動幫我們添加.value 2. Vue是如何決定是否需要自動添加.value的 Vue在解析數據之前, 會自動判斷這個數據是否是ref類型的, 如果是就自動添加.value, 如果不是就不自動添加.value 3. Vue是如何判斷當前的數據是否是ref類型的 通過當前數據的__v_ref來判斷的 如果有這個私有的屬性, 並且取值為true, 那么就代表是一個ref類型的數據
數據是ref類型
<template> <div> <p>{{ age }}</p> <button @click="myFn">按鈕</button> </div> </template> <script> import { ref } from "vue"; export default { name: "App", setup() { // ref類型在底層會自動轉換成reactive類型 // ref(18) -> reactive({value: 18}) let age = ref(18); function myFn() { age.value = 666;
console.log(age) } return { age, myFn }; }, }; </script> <style></style>
效果,點擊按鈕,頁面數據變成666了,注意,vue模板中沒有age.value,因為ref類型的數據有isRef屬性,底層自動會將.value加上。
數據是reactive類型
<template> <div> <p>{{age}}</p> <button @click="myFn">按鈕</button> </div> </template> <script> import {reactive} from 'vue'; export default { name: 'App', setup() { let age = reactive({value: 18}); function myFn() { age.value = 666;
console.log(age) } return {age, myFn} } } </script> <style> </style>
效果,點擊按鈕,頁面還是個對象數據,因為是reactive類型數據,沒有isRef屬性,vue不會自動在模板添加.value, 所以我們需要手動在模板添加age.value
我們如何判斷數據到底是ref還是reactive?
通過isRef / isReactive 方法
<template> <div> <p>{{age}}</p> <button @click="myFn">按鈕</button> </div> </template> <script> import {reactive} from 'vue'; export default { name: 'App', setup() { let age = reactive({value: 18}); function myFn() { console.log(isRef(age)); //false console.log(isReactive(age)); //true age.value = 666; } return {age, myFn} } } </script> <style> </style>