Vue3的動態(tài)組件和異步組價

今天小編在網(wǎng)上閑逛的時候奋刽,發(fā)現(xiàn)前端這幾年的發(fā)展離不開組件的概念备典,之前小編接觸到的組件异旧,基本都是這樣的。大家還可以關(guān)注我的微信公眾號提佣,蝸牛全棧吮蛹。

const app= Vue.createApp({
    template: `
    <input-item />
    <common-item />
        `
})

app.component('input-item',{
    template: `<div>
            <input />
        </div>`
})

app.component('common-item',{
    template: `<div>
            Hello World
        </div>`
})
const vm = app.mount("#root")

這個時候頁面顯示的一個文本框荤崇,一行文字 ,這個時候潮针,如果我們想通過一個按鈕术荤,來切換兩個元素的現(xiàn)實和隱藏關(guān)系,就可以把代碼修改成這樣

const app= Vue.createApp({
    data(){
        return {
            currentItem: 'input-item'
        }
    },
    methods:{
        handleClick(){
            if(this.currentItem === 'input-item'){
                this.currentItem = 'common-item'
            }else{
                this.currentItem = 'input-item'
            }
            // 也可以通過三目運算符來實現(xiàn)每篷。還可以借鑒綁定class或者style綁定
            // this.currentItem = this.currentItem === 'input-item'?'common-item':'input-item'
        }
    },
    template: `
    <input-item v-show="currentItem === 'input-item'" />
    <common-item v-show="currentItem === 'common-item'" />
    <button @click="handleClick">切換</button>
        `
})

app.component('input-item',{
    template: `<div>
            <input />
        </div>`
})

app.component('common-item',{
    template: `<div>
            Hello World
        </div>`
})
const vm = app.mount("#root")

有了動態(tài)組件之后瓣戚,同樣的需求,我們的代碼就可以寫成這樣
// 動態(tài)組件:根據(jù)數(shù)據(jù)的變化焦读,結(jié)合component這個標簽带兜,來隨時動態(tài)切換組件的實現(xiàn)

const app= Vue.createApp({
    data(){
        return {
            currentItem: 'input-item'
        }
    },
    methods:{
        handleClick(){
            if(this.currentItem === 'input-item'){
                this.currentItem = 'common-item'
            }else{
                this.currentItem = 'input-item'
            }
        }
    },
    template: `
    // 為了緩存文本框之前的數(shù)據(jù)
    <keep-alive>
        <component :is="currentItem" />
    </keep-alive>
    <button @click="handleClick">切換</button>
        `
})

app.component('input-item',{
    template: `<div>
            <input />
        </div>`
})

app.component('common-item',{
    template: `<div>
            Hello World
        </div>`
})
const vm = app.mount("#root")

在小編的第一塊代碼中,都是引入自定義標簽的組件之后吨灭,就可以直接展示效果,這種成為同步組件 刑巧,當(dāng)然還有異步組件喧兄,主要是為了解決首屏加載速度的問題,借助Vue3中的defineAsyncComponent啊楚,就像這樣

const AsyncCommonItem = Vue.defineAsyncComponent(() => {
    return new Promise((resolve,reject) => {
        setTimeout(() => {
            resolve({
                template:'<div>this is an async component</div>'
            })
        },4000)
    })
})
const app= Vue.createApp({
    template: `
        <div>
            <common-item />
            <async-common-item />
        </div>
        `
})

app.component('common-item',{
    template: `<div>
            Hello World
        </div>`
})

app.component('async-common-item',AsyncCommonItem)

const vm = app.mount("#root")

當(dāng)然吠冤,今天小編還為大家準備了一些其他常用的知識點,就當(dāng)是飯后甜點吧
一恭理、ref:獲取DOM節(jié)點用的語法拯辙,慎用這種方法,后期維護的時候會很麻煩

const app= Vue.createApp({
    data(){
        return {
            count: 1
        }
    },
    mounted(){ // 只有早這個生命周期或者之后颜价,將元素掛載上涯保,才存在DOM的概念
        console.log(this.$refs.countele)  // <div>1</div>
        this.$refs.commele.sayHello()
    },
    template: `
        <div @click="count += 1">
            <div ref="countele">{{ count }}</div>
            <common-item ref='commele' />
        </div>
        `
})

app.component('common-item',{
    methods:{
        sayHello(){
            alert('hello')
        }
    },
    template: `<div>
            Hello World
        </div>`
})

const vm = app.mount("#root")

二、privide inject:用于組件與子組件的子組件傳遞數(shù)據(jù)的方式

我們在通過組件向子組件的子組件傳遞數(shù)據(jù)的時候周伦,可以這樣

const app= Vue.createApp({
    data(){
        return {
            count: 1
        }
    },
    template: `
        <div>
            <child :count="count"/>
        </div>
        `
})

app.component('child',{
    props:['count'],
    template: `<div>
            <child-child :count="count" />
        </div>`
})


app.component('child-child',{
    props:['count'],
    template: `<div>
            {{ count }}
        </div>`
})
const vm = app.mount("#root")

顯然夕春,這樣很麻煩,通過privide inject专挪,我們可以這么寫

const app= Vue.createApp({
    data(){
        return {
            count: 1
        }
    },
    // provide:{ // 不能直接調(diào)用data中的數(shù)據(jù)及志,需要的時候,需要寫成函數(shù)的方式
    //     count:1
    // },
    // 這種是一次性的寨腔,可以通過Vue3的getter方式響應(yīng)式速侈,通過傳統(tǒng)props一層層傳遞是可以
    provide(){
        return {
            count: this.count
        }
    },
    template: `
        <div>
            <child />
            <button @click="count += 1">增加</button>
        </div>
        `
})

app.component('child',{
    template: `<div>
            <child-child />
        </div>`
})


app.component('child-child',{
    inject:['count'],
    template: `<div>
            {{ count }}
        </div>`
})
const vm = app.mount("#root")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市迫卢,隨后出現(xiàn)的幾起案子倚搬,更是在濱河造成了極大的恐慌,老刑警劉巖靖避,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潭枣,死亡現(xiàn)場離奇詭異比默,居然都是意外死亡,警方通過查閱死者的電腦和手機盆犁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門命咐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谐岁,你說我怎么就攤上這事醋奠。” “怎么了伊佃?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵窜司,是天一觀的道長。 經(jīng)常有香客問我航揉,道長塞祈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任帅涂,我火速辦了婚禮议薪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘媳友。我一直安慰自己斯议,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布醇锚。 她就那樣靜靜地躺著哼御,像睡著了一般。 火紅的嫁衣襯著肌膚如雪焊唬。 梳的紋絲不亂的頭發(fā)上恋昼,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音赶促,去河邊找鬼焰雕。 笑死,一個胖子當(dāng)著我的面吹牛芳杏,可吹牛的內(nèi)容都是我干的矩屁。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼爵赵,長吁一口氣:“原來是場噩夢啊……” “哼吝秕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起空幻,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤烁峭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體约郁,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡缩挑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鬓梅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片供置。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绽快,靈堂內(nèi)的尸體忽然破棺而出芥丧,到底是詐尸還是另有隱情,我是刑警寧澤坊罢,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布续担,位于F島的核電站,受9級特大地震影響活孩,放射性物質(zhì)發(fā)生泄漏物遇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一憾儒、第九天 我趴在偏房一處隱蔽的房頂上張望挎挖。 院中可真熱鬧,春花似錦航夺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冷蚂,卻和暖如春缭保,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝙茶。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工艺骂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隆夯。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓钳恕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蹄衷。 傳聞我的和親對象是個殘疾皇子忧额,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容