vue3父子通信ref,toRef,toRefs使用實(shí)例詳解
ref是什么?
- 生成值類型的響應(yīng)式數(shù)據(jù)
- 可用于模板和reactive
- 通過.value修改值
- 可以獲取DOM元素
<p ref=”elemRef”>{{nameRef}} -- {{state.name}}</p>
// 獲取dom元素
onMounted(()=>{ console.log(elemRef.value); });
toRef是什么?
- 針對(duì)一個(gè)響應(yīng)式對(duì)象(reactive封裝)的prop屬性!!!
- 創(chuàng)建一個(gè)ref, 具有響應(yīng)式
- 兩者保持引用關(guān)系
toRefs是什么?
- 將響應(yīng)式對(duì)象(reactive封裝)轉(zhuǎn)換為普通對(duì)象
- 對(duì)象的每個(gè)prop屬性都是對(duì)應(yīng)的ref
- 兩者保持引用關(guān)系
最佳使用方式
- 用reactive做對(duì)象的響應(yīng)式, 用ref做值類型響應(yīng)式
- 需要解構(gòu)響應(yīng)式對(duì)象使用toRefs(state), 只需要獲取單個(gè)響應(yīng)式值類型使用toRef(state, ‘xxx’);
- ref的變量命名都用xxRef
- 合成函數(shù)返回響應(yīng)式對(duì)象時(shí), 用toRefs(usexx這種鉤子函數(shù));
使用示例:
1. 子組件, script標(biāo)簽是這種寫法: <script setup lang="ts">時(shí)
<script setup lang="ts"> import { ref, reactive, toRef, toRefs, defineProps } from 'vue'; // 父組件傳數(shù)據(jù) :msg="xxx" defineProps({ msg: String }); // 子組件通知父組件使用@onSayHello="xxx", 子組件需要使用時(shí)eg: emites('onSayHello', 'hello啊啊啊啊') interface IEmits { (e: 'onSayHello', arg1: String): void; } const emites = defineEmits<IEmits>(); const state = reactive({ name: 'alice', age: 20, sex: '女' }); // 將reactive封裝的對(duì)象, 使用toRefs獲取的對(duì)象, 它可以進(jìn)一步解構(gòu), 獲取響應(yīng)式值類型變量 const stateRef = toRefs(state); const { name: nameRef, age: ageRef } = stateRef // 將reactive封裝的對(duì)象, 使用toRef獲取某個(gè)屬性值, 具備響應(yīng)式 const sexRef = toRef(state, 'sex') const sayHello2 = () => { msgRef.value = '你好!' emites('onSayHello', 'hello-----') } // xx.key = ???適用于reactive封裝的響應(yīng)式對(duì)象 const updateState = () => { state.name = '雙雙'; state.age = 22; state.sex = '男'; // 或者找到響應(yīng)式值類型,使用 .value進(jìn)行修改 // nameRef.value = '雙雙' // ageRef.value = 22 // sexRef.value = '男' } // ref值類型, 使用.value進(jìn)行修改 const updateRef = () => { msgRef.value = 'hello!' } const msgRef = ref('值類型'); </script> <template> <h1>{{ msg }}</h1> <h1>{{ msgRef }}, 我叫:{{ nameRef }}, 年齡:{{ ageRef }}, 性別:{{ sexRef }}</h1> <button @click="sayHello2">打招呼</button> <button @click="updateState">修改名字,年齡,性別</button> <button @click="updateRef">用英文打招呼</button> </template> <style scoped> .read-the-docs { color: #888; } button { margin: 10px; } </style>
2. 子組件, script標(biāo)簽是這種寫法: <script>時(shí)
<script> import { ref, reactive, toRef, toRefs } from 'vue' export default { props: { msg: String }, emits: ['onSayHello'], setup(props, { emit }) { console.log(props); // 父組件傳進(jìn)來的數(shù)據(jù) const state = reactive({ name: 'alice', age: 20, sex: 1 }); // 將reactive封裝的對(duì)象, 使用toRefs獲取的對(duì)象, 它可以進(jìn)一步解構(gòu), 獲取響應(yīng)式值類型變量 const stateRef = toRefs(state); const { name: nameRef, age: ageRef } = stateRef // 將reactive封裝的對(duì)象, 使用toRef獲取某個(gè)屬性值, 具備響應(yīng)式 const sexRef = toRef(state, 'sex') const sayHello2 = () => { msgRef.value = 'hello, 你好!' emit('onSayHello', 'hello-----') } // xx.key = ???適用于reactive封裝的響應(yīng)式對(duì)象 const updateState = () => { state.name = '雙雙'; state.age = 22; state.sex = 0; } // ref值類型, 使用.value進(jìn)行修改 const updateRef = () => { msgRef.value = '你好啊!' ageRef.value = 33 sexRef.value = '男' } const msgRef = ref('值類型'); // 注意要返回變量和方法等模板需要使用的東西, 否則頁面不會(huì)渲染 return { msgRef, sayHello2, nameRef, ageRef, sexRef, updateState, updateRef, } } } </script> <template> <h1>{{ msgRef }}, 我叫:{{ nameRef }}, 年齡:{{ ageRef }}, 性別:{{ sexRef }}</h1> <button @click="sayHello2">say hello</button> <button @click="updateState">修改state的值</button> <button @click="updateRef">修改ref的值</button> </template> <style scoped> button { margin: 10px; } </style>
父組件: App.vue
<script setup> import HelloWorld from './components/Test2.vue' function onSayHello(a) { console.log(a) } </script> <template> <HelloWorld msg="Vite + Vue" @onSayHello="onSayHello"/> </template> <style scoped> .logo.vue:hover { filter: drop-shadow(0 0 2em #42b883aa); } </style>
到此這篇關(guān)于vue3父子通信+ref,toRef,toRefs使用實(shí)例的文章就介紹到這了,更多相關(guān)vue3 ref toRef toRefs使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue動(dòng)態(tài)組件與內(nèi)置組件淺析講解
閑話少說,我們進(jìn)入今天的小小五分鐘學(xué)習(xí)時(shí)間,前面我們了解了vue的組件,我們本文主要是講解vue的動(dòng)態(tài)組件和內(nèi)置組件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08在 Vue 項(xiàng)目中引入 tinymce 富文本編輯器的完整代碼
這篇文章主要介紹了在 Vue 項(xiàng)目中引入 tinymce 富文本編輯器的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-05-05Vue屏幕自適應(yīng)三種實(shí)現(xiàn)方法詳解
在實(shí)際業(yè)務(wù)中,我們常用圖表來做數(shù)據(jù)統(tǒng)計(jì),數(shù)據(jù)展示,數(shù)據(jù)可視化等比較直觀的方式來達(dá)到一目了然的數(shù)據(jù)查看,但在大屏開發(fā)過程中,常會(huì)因?yàn)檫m配不同屏幕而感到困擾,下面我們來解決一下這個(gè)不算難題的難題2022-11-11vue實(shí)現(xiàn)動(dòng)態(tài)添加元素(可刪除)
文章介紹了如何在Vue中動(dòng)態(tài)添加和刪除元素,通過使用Vue的響應(yīng)式數(shù)據(jù)和v-for指令,可以輕松地實(shí)現(xiàn)這一功能,文章還詳細(xì)講解了如何處理元素的添加和刪除事件,以及如何更新視圖以反映這些變化2024-12-12