Vue3(三)高階

好看的網(wǎng)頁千篇一律叮称,有趣的代碼萬里挑一购撼。
2022新年好唱逢!

關(guān)鍵字:

Vue3高階\Hook函數(shù)\ 生命周期\toRef和toRefs \其他的組合式API

1. Hook函數(shù)

useCar

import {ref,computed} from 'vue'
//導(dǎo)出去一個函數(shù)
export default function(){
    //汽車數(shù)據(jù)
    let carName = ref('保時捷')
    let carPrice = ref(100)
    //汽車的計算屬性
    let carPrice2 = computed(()=>{
        return (carPrice.value*0.8).toFixed(2)
    })
    //操作汽車的方法
    let updateCar = ()=>{
        carName.value = '賓利'
        carPrice.value = 300
    }
    //返回暴露給外界的內(nèi)容
    return {
        carName,
        carPrice,
        carPrice2,
        updateCar
    }
}

usePhone

import {ref,computed} from 'vue'
export default function(){
    //手機數(shù)據(jù)
    let phoneName = ref('華為')
    let phonePrice = ref(5000)
    //手機的計算屬性
    let phonePrice2 = computed(()=>{
        return (phonePrice.value*0.5).toFixed(2)
    })
    //操作手機的方法
    let updatePhone = ()=>{
        phoneName.value = '蘋果'
        phonePrice.value = 9000
    }
    //返回暴露給外界的內(nèi)容
    return {
        phoneName,
        phonePrice,
        phonePrice2,
        updatePhone
    }
}

組件

<h1>Hook函數(shù)</h1>
<div class="car">
    <h2>汽車信息</h2>
    <ul>
        <li>汽車名稱:{{carName}}</li>
        <li>汽車價格:{{carPrice}}萬</li>
        <li>優(yōu)惠價格:{{carPrice2}}萬</li>
        <li>
            <button @click="updateCar">修改汽車信息</button>
        </li>
    </ul>
</div>
<div class="phone">
    <h2>手機信息</h2>
    <ul>
        <li>手機名稱:{{phoneName}}</li>
        <li>手機價格:{{phonePrice}}</li>
        <li>優(yōu)惠價格:{{phonePrice2}}</li>
        <li>
            <button @click="updatePhone">修改手機信息</button>
        </li>
    </ul>
</div>
// 導(dǎo)入hook函數(shù)
import useCar from '../hooks/useCar'
import usePhone from '../hooks/usePhone'
export default {
    setup() {
        // 返回模板中需要使用的數(shù)據(jù)
        return {
            //返回汽車信息
            ...useCar(),
            //返回手機信息
            ...usePhone()
        }
    }
}

2. 生命周期

變化挺大的:

<h1>生命周期</h1>
<h3>
    數(shù)量:{{count}}
    <button @click="count++">數(shù)量++</button>    
</h3>
// 組合式API生命周期函數(shù)
import {onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted} from 'vue'
export default {
    // beforeCreate() {
    //     console.log('創(chuàng)建之前');
    // },
    // created() {
    //     console.log('創(chuàng)建完成');
    // },
    // beforeMount() {
    //     console.log('掛載之前1');
    // },
    // mounted() {
    //     console.log('掛載完成1');
    // },
    // beforeUpdate() {
    //     console.log('更新之前1');
    // },
    // updated() {
    //     console.log('更新完成1');
    // },
    //注意:在vue3中危融,對beforeDestroy和destroyed這兩個生命周期函數(shù)鞋怀,進行了重命名
    /* beforeDestroy() {
        console.log('銷毀之前');
    },
    destroyed() {
        console.log('銷毀完成');    
    }, */
    // 在vue3中双泪,beforeUnmount 替換了 beforeDestroy;unmounted 替換了 destroyed
    // beforeUnmount() {
    //     console.log('卸載之前1');
    // },
    // unmounted() {
    //     console.log('卸載完成1');
    // },
    data() {
        return {
            count:1
        }
    },
    // setup()函數(shù)密似,可以替代beforeCreate 和 created 這兩個生命周期函數(shù)
    setup() {
        console.log('setup');
        //組合式API生命周期函數(shù)焙矛,會先與傳統(tǒng)的生命周期函數(shù)執(zhí)行
        onBeforeMount(()=>{
            console.log('掛載之前2');
        })
        onMounted(()=>{
            console.log('掛載完成2');
        })
        onBeforeUpdate(()=>{
            console.log('修改之前2');
        })
        onUpdated(()=>{
            console.log('修改完成2');
        })
        onBeforeUnmount(()=>{
            console.log('卸載之前2');
        })
        onUnmounted(()=>{
            console.log('卸載完成2');
        })
    }
}

3. toRef和toRefs

<h1>toRef和toRefs</h1>
<div class="stu">
    <h2>學(xué)生信息</h2>
    <ul>
        <li>姓名:{{name}}</li>
        <li>姓名:{{age}}</li>
        <li>車名:{{car.name}}</li>
        <li>車價:{{car.price}}</li>
    </ul>
</div>
import { reactive,toRef,toRefs } from 'vue'
export default {
    setup() {
        // 定義數(shù)據(jù)
        let stuData = reactive({
            name:'張三',
            age:20,
            car:{
                name:'大眾',
                price:'20W'
            }
        })
        return{
            // toRef()函數(shù),可以用來為一個 reactive 對象的屬性創(chuàng)建一個 ref
            // 這樣做的好處是残腌,簡化了模板中的表達式村斟。
            // toRef()函數(shù),需要傳兩個參數(shù):1.reactive 對象抛猫,2.具體的屬性名
            // name:toRef(stuData,'name'),
            // age:toRef(stuData,'age'),
            // car:toRef(stuData,'car')
            // 假如 reactive 對象中蟆盹,有100個屬性,上面的操作要寫100次闺金,所以逾滥,一般都直接用toRefs函數(shù)
            // toRefs函數(shù),把一個響應(yīng)式對象轉(zhuǎn)換成普通對象败匹,該普通對象的每個 屬性 都是一個 ref 
            ...toRefs(stuData)
        }
    }
}

4.其他的組合式API

<h1>其他的組合式API</h1>
<div>
    學(xué)生信息:{{stuData}}
    <br>
    <button @click="stuData.age++">修改年齡</button>
    <button @click="stuData.car.price++">修改車價</button>
</div>
<div>
    num3的值:{{num3}}
</div>
<div>
    汽車信息:{{car}}
    <button @click="updateCar">修改汽車</button>
</div>
<div>
    手機信息:{{phone}}
    <button @click="updatePhone">修改手機</button>
</div>
<div>
    年齡:{{age}}
    <button @click="age++">年齡++</button>
</div>
import {ref,reactive,readonly,isRef,unref, shallowRef, isReactive, shallowReactive,customRef,toRaw, markRaw} from 'vue'
export default {
    setup() {
        // 定義數(shù)據(jù)
        // readonly()函數(shù)寨昙,返回一份只讀數(shù)據(jù)讥巡,這個只讀是“深層的”,內(nèi)部任何嵌套的屬性也都是只讀的
        let stuData = readonly({
            name:'張三',
            age:20,
            car:{
                name:'大眾',
                price:20
            }
        })
        let num1 = ref(100)
        let num2 = 200
        // isRef()函數(shù)舔哪,檢查一個值是否為一個 ref 對象
        // isProxy()函數(shù)欢顷,檢查一個對象是否是由 reactive 或者 readonly 方法創(chuàng)建的代理
        // isReactive()函數(shù),檢查一個對象是否是由 reactive 創(chuàng)建的響應(yīng)式代理
        // isReadonly()函數(shù)捉蚤,檢查一個對象是否是由 readonly 創(chuàng)建的只讀代理
        // let num3 = (isRef(num1)?num1.value:num1) + (isRef(num2)?num2.value:num2)
        // unref()函數(shù)吱涉,如果參數(shù)是一個 ref 則返回它的 value,否則返回參數(shù)本身
        let num3 = unref(num1) + unref(num2)
        // ref() 返回的對象 value 屬性值是 reactive對象(代理對象)
        // shallowRef() 返回的對象 value 屬性值是 object對象(普通對象)外里,不再具備任何響應(yīng)式了
        let car = shallowRef({
            name:'大眾',
            type:{
                typeName:'SUV'
            }
        })
        let updateCar = ()=>{
            // 由于value返回的是object對象怎爵,所以,這里不再具有響應(yīng)式
            car.value.name = '奔馳'
            car.value.type.typeName = '跑車'
        }
        // shallowReactive() 返回一個淺層的響應(yīng)式代理盅蝗,只對對象的第一層屬性創(chuàng)建響應(yīng)式
        let phone = shallowReactive({
            name:'華為',
            type:{
                typeName:'滑蓋手機'
            }
        })
        // toRaw() 將代理對象轉(zhuǎn)為一個普通對象返回
        let phone2 = toRaw(phone)
        console.log(phone2);
        console.log('--------------------');
        //定義了一份數(shù)據(jù)
        // markRaw() 記一個對象為“永遠(yuǎn)不會轉(zhuǎn)為響應(yīng)式代理”
        let food = markRaw({
            name:'面包'
        })
        // 注意:food2就是一個普通對象
        let food2 = reactive(food)
        console.log(food2);
        let updatePhone = ()=>{
            //修改name鳖链,會觸發(fā)頁面更新
            // phone.name += "!"
            //修改type里面的屬性,不會觸發(fā)頁面更新
            phone.type.typeName += "!"
        }
        //自定義一個ref
        function useDebouncedRef(value, delay = 200) {
            let timeout
            // customRef(),用于自定義一個 ref
            return customRef((track, trigger) => {
                return {
                    get() {
                        track()
                        return value
                    },
                    set(newValue) {
                        clearTimeout(timeout)
                            timeout = setTimeout(() => {
                            value = newValue
                            trigger()
                        }, delay)
                    },
                }
            })
        }
        let age = useDebouncedRef(20,2000)
        return {
            stuData,
            num3,
            car,
            updateCar,
            phone,
            updatePhone,
            age
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末墩莫,一起剝皮案震驚了整個濱河市芙委,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狂秦,老刑警劉巖灌侣,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異裂问,居然都是意外死亡侧啼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門堪簿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痊乾,“玉大人,你說我怎么就攤上這事椭更∧纳螅” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵虑瀑,是天一觀的道長湿滓。 經(jīng)常有香客問我,道長舌狗,這世上最難降的妖魔是什么叽奥? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮把夸,結(jié)果婚禮上而线,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好膀篮,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布嘹狞。 她就那樣靜靜地躺著,像睡著了一般誓竿。 火紅的嫁衣襯著肌膚如雪磅网。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天筷屡,我揣著相機與錄音涧偷,去河邊找鬼。 笑死毙死,一個胖子當(dāng)著我的面吹牛燎潮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扼倘,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼确封,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了再菊?” 一聲冷哼從身側(cè)響起爪喘,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纠拔,沒想到半個月后秉剑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡稠诲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年侦鹏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吕粹。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡种柑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匹耕,到底是詐尸還是另有隱情,我是刑警寧澤荠雕,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布稳其,位于F島的核電站,受9級特大地震影響炸卑,放射性物質(zhì)發(fā)生泄漏既鞠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一盖文、第九天 我趴在偏房一處隱蔽的房頂上張望嘱蛋。 院中可真熱鬧,春花似錦、人聲如沸洒敏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凶伙。三九已至郭毕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間函荣,已是汗流浹背显押。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留傻挂,地道東北人乘碑。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像金拒,于是被迫代替她去往敵國和親蝉仇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

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