vue3中ref、reactive、toRef、toRefs的使用
四个函数都是用于在setup中创造响应式变量的
ref
ref
可用于任何类型的数据创建响应式,取值需要加.value
。对于基本数据类型,ref
的性能优于reactive
,而对于对象类型,ref
仍然是通过reactive
包装实现的。推荐优先使用ref
,方便逻辑拆分和业务解耦。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <div id="app"> <p>{{ webName }}</p> </div>
<script> const app = Vue.createApp({ setup(props, context) { const { ref } = Vue; // 需要响应的改变的数据必须使用ref函数 let webName = ref("xiguapengpeng"); // 3s后修改数据,页面数据跟着变化 setTimeout(() => { // ref接收参数并有一个value属性 webName.value = "https://xiguapengpeng.github.io/"; }, 3000);
// 暴露变量供视图使用 return { webName }; }, });
const vm = app.mount("#app"); </script>
|
reactive
reactive
只用于创建引用类型数据的响应式,取值不需要加.value
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <div id="app"> <p>{{ objData.webName }}</p> <p>{{ objData.webUrl }}</p> </div>
<script> const app = Vue.createApp({ setup(props, context) { // 数组或对象使用 reactive 函数 const { reactive } = Vue; // 对象数据 let objData = reactive({ webName: 'xiguapengpeng', webUrl: 'https://xiguapengpeng.github.io/', });
setTimeout(() => { objData.webName = '温新'; }, 3000);
// 暴露变量供视图使用 return { objData }; } });
const vm = app.mount('#app'); </script>
|
toRef
将对象中的属性单独变成响应式数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <div id="app"> <p>{{ objData1.webName }}</p> <p>{{ objData1.webUrl }}</p> <p>{{ objData2.webName }}</p> <p>{{ objData2.webUrl }}</p> </div>
<script> const app = Vue.createApp({ setup(props, context) { const { reactive, toRefs, toRef } = Vue; // 对象数据 let objData1 = reactive({ webName: 'xiguapengpeng' }); let objData2 = { webName: 'fafa' };
// 若objData中没有webUrl,则赋值为空 let webUrl1 = toRef(objData1, 'webUrl'); let webUrl2 = toRef(objData2, 'webUrl'); setTimeout(() => { webUrl1.value = 'https://xiguapengpeng.github.io/'; webUrl2.value = 'https://xiguapengpeng.gitee.io/'; }, 3000);
return { objData1, objData2 }; } });
const vm = app.mount('#app'); </script>
|
toRefs
使解构后的数据重新获得响应式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <div id="app"> <p>{{ webName }}</p> <p>{{ webUrl }}</p> </div>
<script> const app = Vue.createApp({ setup(props, context) { // 数组或对象使用 reactive 函数 const { reactive, toRefs } = Vue; // 对象数据 let objData = reactive({ webName: 'xiguapengpeng', webUrl: 'https://xiguapengpeng.github.io/' });
// 数据对象结构 let { webName, webUrl } = toRefs(objData);
return { webName, webUrl }; } });
const vm = app.mount('#app'); </script>
|
总结
类型 |
是否触发页面改变 |
是否可以解构 |
ref |
✔ |
❌ |
reactive |
✔ |
❌ |
toRef |
❌ |
❌ |
toRefs |
❌ |
✔ |