vue3渲染函數(shù)(h函數(shù))的變更剖析
更新時(shí)間:2022年10月27日 08:33:23 作者:南風(fēng)晚來晚相識
這篇文章主要介紹了vue3渲染函數(shù)(h函數(shù))的變化,文中給大家介紹了h函數(shù)的三個(gè)參數(shù)詳細(xì)說明及vue3 h函數(shù)-綁定事件,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
vue3 渲染函數(shù)(h函數(shù))的更改
h函數(shù)的更改總結(jié) 1==>h 現(xiàn)在全局導(dǎo)入,而不是作為參數(shù)傳遞給渲染函數(shù) 2==>渲染函數(shù)參數(shù)更改為在有狀態(tài)組件和函數(shù)組件之間更加一致 3==>vnode 現(xiàn)在有一個(gè)扁平的 prop 結(jié)構(gòu)
h函數(shù)的三個(gè)參數(shù)詳細(xì)說明
第一個(gè)參數(shù)是必須的?!靖瓉淼氖且粯拥摹]有發(fā)生變化】 類型:{String | Object | Function} 一個(gè) HTML 標(biāo)簽名、一個(gè)組件、一個(gè)異步組件、或一個(gè)函數(shù)式組件。 是要渲染的html標(biāo)簽。 第一個(gè)參數(shù)div 是表示創(chuàng)建一個(gè)div的元素 第二個(gè)參數(shù)是可選的。 【第二個(gè)參數(shù)的格式發(fā)生了變化, 現(xiàn)在是一個(gè)扁平的 prop 結(jié)構(gòu)】 類型:{Object} 主要是當(dāng)前html中的各種屬性。 在開發(fā)時(shí)。建議傳,實(shí)在沒有傳的時(shí)候,傳入 null 第三個(gè)參數(shù)可選的。(第三個(gè)參數(shù)建議使用函數(shù)返回,否者會有警告) 類型:{String | Array | Object} children 虛擬子節(jié)點(diǎn)(vnodes),當(dāng)前html標(biāo)簽的元素。 ps:第三個(gè)參數(shù)建議使用函數(shù)返回。否者在控制有警告 Non-function value encountered for default slot. Prefer function slots for better performance.
VNode Props 格式化 vue2.x 語法
{ class: ['button', 'is-outlined'], style: { color: '#34495E' }, attrs: { id: 'submit' }, domProps: { innerHTML: '' }, on: { click: submitForm }, key: 'submit-button' }
VNode Props 格式化 vue3.x 語法
{ class: ['button', 'is-outlined'], style: { color: '#34495E' }, //屬性不需要放在 attrs domProps on這些字段下了。 id: 'submit', innerHTML: '', onClick: submitForm, key: 'submit-button' }
vue2中render 函數(shù)將自動接收 h 函數(shù) (它是 createElement 的常規(guī)別名) 作為參數(shù)
render(h){ return h('div',{ //第二個(gè)參數(shù) class:{ 'is-red': true } }, //第三個(gè)參數(shù) [h('p','這是一個(gè)render')] );
vue3 h函數(shù)-綁定事件
//renderTest.vue <script lang="ts"> import { h, reactive } from 'vue' export default { setup(props, { slots, attrs, emit }) { const state = reactive({ count: 0 }) function increment() { state.count++ } // 返回render函數(shù) return () => h( 'button', { onClick: increment //這里綁定事件 }, state.count ) } } </script>
vue3 render函數(shù)簡單的循環(huán) map
<script lang="ts"> import { h, reactive } from 'vue' export default { setup() { const state = reactive({ listArr: [ { name: '三悅有了新工作', like: '工作答辯-你為什來這個(gè)-為了錢',id:'00' }, { name: '三悅有了新工作', like: '沒有最好的選擇,那不太壞的選擇也可以吧', id: '01' }, { name: '三悅有了新工作', like: '沒有最好的選擇,那不太壞的選擇也可以吧', id: '02' }, { name: '三悅有了新工作', like: '沒有那么好,就是比什么都不做多做了一點(diǎn)點(diǎn)而已',id: '03' }, { name: '三悅有了新工作', like: '能好好說話是因?yàn)閻?,不能好好說話,是因?yàn)樘煜ち司屯诉吔?, id: '04' } ] }) // 返回render函數(shù) return () => h( 'ul', null, [ state.listArr.map(item => { //通過map進(jìn)行循環(huán) return h('li', { key: item.id }, ['劇名:',item.name,'我喜歡的句子:', item.like]) }) ] ) } } </script>
vue3 默認(rèn)插槽-slots.default?.()
//renderTest.vue 文件 <script lang="ts"> import { h } from 'vue' export default { setup(props, { slots }) { return () => h( 'div', null, [ h('h1', null, '我組件的默認(rèn)內(nèi)容'), h('h2', null, [slots.default?.()]), ] ) } } </script>
//頁面使用 renderTest.vue這個(gè)組件 <template> <div class="father-div"> <renderTest> <p>默認(rèn)插槽</p> </renderTest> </div> </template> <script setup lang="ts"> import renderTest from './renderTest.vue' </script>
具名插槽
//renderTest.vue 文件 <script lang="ts"> import { h } from 'vue' export default { setup(props, { slots }) { return () => h( 'div', null, [ //第三個(gè)參數(shù)建議使用函數(shù)返回. h('h1', null, '我組件的默認(rèn)內(nèi)容'), h('h2', null, [slots.details?.()]), ] ) } } </script>
//頁面使用 renderTest.vue這個(gè)組件 <template> <div class="father-div"> <renderTest> <template #details> <p>我是具名插槽中的內(nèi)容</p> </template> </renderTest> </div> </template> <script setup lang="ts"> import renderTest from './renderTest.vue' </script>
props 父傳子
//renderTest.vue <script lang="ts"> import { h } from 'vue' export default { props: { title: { type: String } }, setup(props, { slots }) { return () => h( 'div', null, //接受父組件 props傳遞過來的數(shù)據(jù),第三個(gè)參數(shù)建議使用函數(shù)返回 props.title ) } } </script>
//頁面使用 renderTest.vue這個(gè)組件 <template> <div class="father-div"> <renderTest title="父組件給的數(shù)據(jù)"></renderTest> </div> </template> <script setup lang="ts"> import renderTest from './renderTest.vue' </script>
emit 子傳父
//renderTest.vue 文件 <script lang="ts"> import { h } from 'vue' //把按鈕作為標(biāo)簽需要導(dǎo)入 import { ElButton } from 'element-plus' export default { props: { title: { type: String } }, setup(props, { emit }) { return () => h( 'div', null, [ //把按鈕作為標(biāo)簽需要導(dǎo)入 h(ElButton, { type:"primary", // 注意這里需要使用箭頭函數(shù), onClick: () => emit('myClick', '123') }, //第三個(gè)參數(shù)建議使用函數(shù)返回。否者在控制有警告 // Non-function value encountered for default slot. Prefer function slots for better performance. ()=>'點(diǎn)擊我' ) ] ) } } </script>
//頁面使用 renderTest.vue這個(gè)組件 <template> <div class="father-div"> <renderTest @myClick="myClick"></renderTest> </div> </template> <script setup lang="ts"> import renderTest from './renderTest.vue' const myClick = (mess:string) => { console.log('子組件給的數(shù)據(jù)', mess) } </script>
需要注意的點(diǎn)
1.如果使用ElButton作為標(biāo)簽。需要引入import { ElButton } from 'element-plus'。 否則在頁面中無法正常解析。 2. 第三個(gè)參數(shù)建議使用函數(shù)返回。否者在控制有警告 Non-function value encountered for default slot. Prefer function slots for better performance. 詳細(xì)地址 :https://cn.vuejs.org/guide/extras/render-function.html#v-if
到此這篇關(guān)于vue3渲染函數(shù)(h函數(shù))的變化的文章就介紹到這了,更多相關(guān)vue3渲染函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue單行文本溢出會出現(xiàn)title提示自定義指令
這篇文章主要為大家介紹了vue單行文本溢出會出現(xiàn)title提示自定義指令,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Vue路由組件的緩存keep-alive和include屬性的具體使用
:瀏覽器頁面在進(jìn)行切換時(shí),原有的路由組件會被銷毀,通過緩存可以保存被切換的路由組件,本文主要介紹了Vue路由組件的緩存keep-alive和include屬性的具體使用,感興趣的可以了解一下2023-11-11Vue使用PDF.js實(shí)現(xiàn)瀏覽pdf文件功能
這篇文章主要為大家詳細(xì)介紹了Vue如何使用PDF.js實(shí)現(xiàn)瀏覽pdf文件功能,文中的實(shí)現(xiàn)步驟講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-04-04Vue實(shí)現(xiàn)獲取后端接口API代碼片段(已封裝Service方法名)
Vue實(shí)現(xiàn)獲取后端接口API代碼片段(已封裝Service方法名),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07