vue3使用ref獲取dom結(jié)果為'null'的原因詳析
在vue2中,我們使用ref獲取dom元素時是這樣子的:
// 父組件 <template> <div> <button @click=handleClick>我裝載了一個子組件!</button> <son ref="dataList"></son> </div> </template> <script> import son from './data.vue' export default { components: { son }, methods:{ handleClick(){ console.log(this.$refs.dataList) //像這樣! } } } </script>
在vue3中,我們使用ref獲取dom元素時是這樣子的:
// 父組件 <template> <button @click=handleClick>我裝載了一個子組件!</button> <son ref="dataList"></son> </template> <script> import {ref} from 'vue' import son from './data.vue' export default { setup(){ const dataList=ref(null) const handleClick=()=>{ console.log(dataList.value) //像這樣! } return{ dataList //這里要拋出響應(yīng)式數(shù)據(jù)才可使用。 } } } </script>
下面來說說vue3中獲取dom為空的原因:
1.setup的return中應(yīng)該拋出ref封裝的字段,否則ref的值只是定義了并不能響應(yīng)式使用,事實上,所有ref或者reactive定義的值都應(yīng)在return中拋出。
2.直接在setup()中打印。這就是生命周期的問題了,setup本質(zhì)上相當(dāng)于vue2中的created,在創(chuàng)建階段,dom元素還未完全創(chuàng)建完成,此時獲取dom自然為null了。上面的例子中我是在點擊按鈕中觸發(fā)的,此時早已經(jīng)過創(chuàng)建階段,如果你想更早,可以手動定義onMented去打印,如下:
import {ref,onMented} from 'vue' export default { setup(){ const dataList=ref(null) onMented(()=>{ console.log(dataList.value) //像這樣! }) return{ dataList } } }
3.如果你在使用時出現(xiàn)ref.value取不到子組件里的值,或者報錯ref.value對象為空的情況,那是因為子組件要把能夠被負(fù)組件調(diào)用的方法暴露出來,在子組件里加上defineExpose就可以啦。
defineExpose({ onOpen //這是你要調(diào)用的方法名 });
總結(jié)
到此這篇關(guān)于vue3使用ref獲取dom結(jié)果為'null'的原因詳析的文章就介紹到這了,更多相關(guān)vue3 ref獲取dom結(jié)果為null內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3中進(jìn)行二維碼的生成與解碼實現(xiàn)詳解
這篇文章主要為大家介紹了Vue3中進(jìn)行二維碼的生成與解碼實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03ElementUI中<el-form>標(biāo)簽中ref、:model、:rules的作用淺析
Element官方文檔中寫到,model是表單數(shù)據(jù)對象,rules是表單驗證規(guī)則,下面這篇文章主要給大家介紹了關(guān)于ElementUI中<el-form>標(biāo)簽中ref、:model、:rules作用的相關(guān)資料,需要的朋友可以參考下2023-01-01解讀Vue3中keep-alive和動態(tài)組件的實現(xiàn)邏輯
這篇文章主要介紹了Vue3中keep-alive和動態(tài)組件的實現(xiàn)邏輯,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05