• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
    當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

    Vue.js提升必知的幾點(diǎn)總結(jié)

    來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 19:56:04
    文檔

    Vue.js提升必知的幾點(diǎn)總結(jié)

    Vue.js提升必知的幾點(diǎn)總結(jié):這次給大家?guī)?lái)Vue.js提升必知的幾點(diǎn)總結(jié),Vue.js提升的注意事項(xiàng)有哪些,下面就是實(shí)戰(zhàn)案例,一起來(lái)看一下。 第一招:化繁為簡(jiǎn)的Watchers 場(chǎng)景還原:created(){ this.fetchPostList() }, watch: { searchInputValue(){ this.fe
    推薦度:
    導(dǎo)讀Vue.js提升必知的幾點(diǎn)總結(jié):這次給大家?guī)?lái)Vue.js提升必知的幾點(diǎn)總結(jié),Vue.js提升的注意事項(xiàng)有哪些,下面就是實(shí)戰(zhàn)案例,一起來(lái)看一下。 第一招:化繁為簡(jiǎn)的Watchers 場(chǎng)景還原:created(){ this.fetchPostList() }, watch: { searchInputValue(){ this.fe

    這次給大家?guī)?lái)Vue.js提升必知的幾點(diǎn)總結(jié),Vue.js提升的注意事項(xiàng)有哪些,下面就是實(shí)戰(zhàn)案例,一起來(lái)看一下。

    第一招:化繁為簡(jiǎn)的Watchers

    場(chǎng)景還原:

    created(){
     this.fetchPostList()
    },
    watch: {
     searchInputValue(){
     this.fetchPostList()
     }
    }

    組件創(chuàng)建的時(shí)候我們獲取一次列表,同時(shí)監(jiān)聽(tīng)input框,每當(dāng)發(fā)生變化的時(shí)候重新獲取一次篩選后的列表這個(gè)場(chǎng)景很常見(jiàn),有沒(méi)有辦法優(yōu)化一下呢?

    招式解析:

    首先,在watchers中,可以直接使用函數(shù)的字面量名稱;其次,聲明immediate:true表示創(chuàng)建組件時(shí)立馬執(zhí)行一次。

    watch: {
     searchInputValue:{
     handler: 'fetchPostList',
     immediate: true
     }
    }

    第二招:一勞永逸的組件注冊(cè)

    場(chǎng)景還原:

    import BaseButton from './baseButton'
    import BaseIcon from './baseIcon'
    import BaseInput from './baseInput'
    export default {
     components: {
     BaseButton,
     BaseIcon,
     BaseInput
     }
    }
    <BaseInput
     v-model="searchText"
     @keydown.enter="search"
    />
    <BaseButton @click="search">
     <BaseIcon name="search"/>
    </BaseButton>

    我們寫了一堆基礎(chǔ)UI組件,然后每次我們需要使用這些組件的時(shí)候,都得先import,然后聲明components,很繁瑣!秉持能偷懶就偷懶的原則,我們要想辦法優(yōu)化!

    招式解析:

    我們需要借助一下神器webpack,使用 require.context() 方法來(lái)創(chuàng)建自己的(模塊)上下文,從而實(shí)現(xiàn)自動(dòng)動(dòng)態(tài)require組件。這個(gè)方法需要3個(gè)參數(shù):要搜索的文件夾目錄,是否還應(yīng)該搜索它的子目錄,以及一個(gè)匹配文件的正則表達(dá)式。

    我們?cè)赾omponents文件夾添加一個(gè)叫g(shù)lobal.js的文件,在這個(gè)文件里借助webpack動(dòng)態(tài)將需要的基礎(chǔ)組件統(tǒng)統(tǒng)打包進(jìn)來(lái)。

    import Vue from 'vue'
    function capitalizeFirstLetter(string) {
     return string.charAt(0).toUpperCase() + string.slice(1)
    }
    const requireComponent = require.context(
     '.', false, /\.vue$/
     //找到components文件夾下以.vue命名的文件
    )
    requireComponent.keys().forEach(fileName => {
     const componentConfig = requireComponent(fileName)
     const componentName = capitalizeFirstLetter(
     fileName.replace(/^\.\//, '').replace(/\.\w+$/, '')
     //因?yàn)榈玫降膄ilename格式是: './baseButton.vue', 所以這里我們?nèi)サ纛^和尾,只保留真正的文件名
     )
     Vue.component(componentName, componentConfig.default || componentConfig)
    })

    最后我們?cè)趍ain.js中import 'components/global.js',然后我們就可以隨時(shí)隨地使用這些基礎(chǔ)組件,無(wú)需手動(dòng)引入了。

    第三招:釜底抽薪的router key

    場(chǎng)景還原:

    下面這個(gè)場(chǎng)景真的是傷透了很多程序員的心...先默認(rèn)大家用的是Vue-router來(lái)實(shí)現(xiàn)路由的控制。

    假設(shè)我們?cè)趯懸粋€(gè)博客網(wǎng)站,需求是從/post-page/a,跳轉(zhuǎn)到/post-page/b。然后我們驚人的發(fā)現(xiàn),頁(yè)面跳轉(zhuǎn)后數(shù)據(jù)竟然沒(méi)更新?!原因是vue-router"智能地"發(fā)現(xiàn)這是同一個(gè)組件,然后它就決定要復(fù)用這個(gè)組件,所以你在created函數(shù)里寫的方法壓根就沒(méi)執(zhí)行。通常的解決方案是監(jiān)聽(tīng)$route的變化來(lái)初始化數(shù)據(jù),如下:

    data() {
     return {
     loading: false,
     error: null,
     post: null
     }
    }, 
    watch: {
     '$route': {
     handler: 'resetData',
     immediate: true
     }
    },
    methods: {
     resetData() {
     this.loading = false
     this.error = null
     this.post = null
     this.getPost(this.$route.params.id)
     },
     getPost(id){
     }
    }

    bug是解決了,可每次這么寫也太不優(yōu)雅了吧?秉持著能偷懶則偷懶的原則,我們希望代碼這樣寫:

    data() {
     return {
     loading: false,
     error: null,
     post: null
     }
    },
    created () {
     this.getPost(this.$route.params.id)
    },
    methods () {
     getPost(postId) {
     // ...
     }
    }

    招式解析:

    那要怎么樣才能實(shí)現(xiàn)這樣的效果呢,答案是給router-view添加一個(gè)unique的key,這樣即使是公用組件,只要url變化了,就一定會(huì)重新創(chuàng)建這個(gè)組件。(雖然損失了一丟丟性能,但避免了無(wú)限的bug)。同時(shí),注意我將key直接設(shè)置為路由的完整路徑,一舉兩得。

    <router-view :key="$route.fullpath"></router-view>

    第四招: 無(wú)所不能的render函數(shù)

    場(chǎng)景還原:

    vue要求每一個(gè)組件都只能有一個(gè)根元素,當(dāng)你有多個(gè)根元素時(shí),vue就會(huì)給你報(bào)錯(cuò)

    <template>
     <li
     v-for="route in routes"
     :key="route.name"
     >
     <router-link :to="route">
     {{ route.title }}
     </router-link>
     </li>
    </template>
     ERROR - Component template should contain exactly one root element. 
     If you are using v-if on multiple elements, use v-else-if 
     to chain them instead.

    招式解析:

    那有沒(méi)有辦法化解呢,答案是有的,只不過(guò)這時(shí)候我們需要使用render()函數(shù)來(lái)創(chuàng)建HTML,而不是template。其實(shí)用js來(lái)生成html的好處就是極度的靈活功能強(qiáng)大,而且你不需要去學(xué)習(xí)使用vue的那些功能有限的指令A(yù)PI,比如v-for, v-if。(reactjs就完全丟棄了template)

    functional: true,
    render(h, { props }) {
     return props.routes.map(route =>
     <li key={route.name}>
     <router-link to={route}>
     {route.title}
     </router-link>
     </li>
     )
    }

    第五招:無(wú)招勝有招的高階組件

    劃重點(diǎn):這一招威力無(wú)窮,請(qǐng)務(wù)必掌握

    當(dāng)我們寫組件的時(shí)候,通常我們都需要從父組件傳遞一系列的props到子組件,同時(shí)父組件監(jiān)聽(tīng)子組件emit過(guò)來(lái)的一系列事件。舉例子:

    //父組件
    <BaseInput 
     :value="value"
     label="密碼" 
     placeholder="請(qǐng)?zhí)顚懨艽a"
     @input="handleInput"
     @focus="handleFocus>
    </BaseInput>
    //子組件
    <template>
     <label>
     {{ label }}
     <input
     :value="value"
     :placeholder="placeholder"
     @focus=$emit('focus', $event)"
     @input="$emit('input', $event.target.value)"
     >
     </label>
    </template>

    有下面幾個(gè)優(yōu)化點(diǎn):

    1.每一個(gè)從父組件傳到子組件的props,我們都得在子組件的Props中顯式的聲明才能使用。這樣一來(lái),我們的子組件每次都需要申明一大堆props, 而類似placeholer這種dom原生的property我們其實(shí)完全可以直接從父?jìng)鞯阶樱瑹o(wú)需聲明。方法如下:

    <input
     :value="value"
     v-bind="$attrs"
     @input="$emit('input', $event.target.value)"
     >

    $attrs包含了父作用域中不作為 prop 被識(shí)別 (且獲取) 的特性綁定 (class 和 style 除外)。當(dāng)一個(gè)組件沒(méi)有聲明任何 prop 時(shí),這里會(huì)包含所有父作用域的綁定,并且可以通過(guò) v-bind="$attrs" 傳入內(nèi)部組件——在創(chuàng)建更高層次的組件時(shí)非常有用。

    2.注意到子組件的@focus=$emit('focus', $event)"其實(shí)什么都沒(méi)做,只是把event傳回給父組件而已,那其實(shí)和上面類似,我完全沒(méi)必要顯式地申明:

    <input
     :value="value"
     v-bind="$attrs"
     v-on="listeners"
    >
    computed: {
     listeners() {
     return {
     ...this.$listeners,
     input: event => 
     this.$emit('input', event.target.value)
     }
     }
    }

    $listeners包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監(jiān)聽(tīng)器。它可以通過(guò) v-on="$listeners" 傳入內(nèi)部組件——在創(chuàng)建更高層次的組件時(shí)非常有用。

    3.需要注意的是,由于我們input并不是BaseInput這個(gè)組件的根節(jié)點(diǎn),而默認(rèn)情況下父作用域的不被認(rèn)作 props 的特性綁定將會(huì)“回退”且作為普通的 HTML 特性應(yīng)用在子組件的根元素上。所以我們需要設(shè)置inheritAttrs:false,這些默認(rèn)行為將會(huì)被去掉, 以上兩點(diǎn)的優(yōu)化才能成功。

    相信看了本文案例你已經(jīng)掌握了方法,更多精彩請(qǐng)關(guān)注Gxl網(wǎng)其它相關(guān)文章!

    推薦閱讀:

    vue的新手入門教程

    Vue項(xiàng)目怎樣分環(huán)境打包

    聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    Vue.js提升必知的幾點(diǎn)總結(jié)

    Vue.js提升必知的幾點(diǎn)總結(jié):這次給大家?guī)?lái)Vue.js提升必知的幾點(diǎn)總結(jié),Vue.js提升的注意事項(xiàng)有哪些,下面就是實(shí)戰(zhàn)案例,一起來(lái)看一下。 第一招:化繁為簡(jiǎn)的Watchers 場(chǎng)景還原:created(){ this.fetchPostList() }, watch: { searchInputValue(){ this.fe
    推薦度:
    標(biāo)簽: 必備 VUE 總結(jié)
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品嫩草视频永久网址| 午夜精品视频在线| 97久视频精品视频在线老司机 | 亚洲国产精品尤物yw在线| 88国产精品无码一区二区三区| 精品无码国产污污污免费网站| 无码乱码观看精品久久| 国产精品单位女同事在线| 国产偷亚洲偷欧美偷精品| 国产精品亚洲日韩欧美色窝窝色欲| 一级做a爰黑人又硬又粗免费看51社区国产精品视 | 久久久国产乱子伦精品作者| 四虎国产精品成人免费久久| 精品久久久久久99人妻| 国产精品美女久久久网AV| 欧美一区二区精品| 999成人精品视频在线| 国产精品一区二区av| 久久久精品人妻一区二区三区蜜桃 | 亚洲精品无码专区在线播放| 国内精品国产成人国产三级| 99视频在线精品国自产拍亚瑟| 精品三级在线观看| 69久久夜色精品国产69| 精品不卡一区二区| 久久精品亚洲日本波多野结衣 | 亚洲国产精品久久久久久| 精品午夜久久福利大片| 国产精品成人不卡在线观看| 国产精品视频二区不卡| 成人国产精品免费视频| 国产综合色在线精品| 国产精品白浆在线观看免费| 国产精品女同久久久久电影院| 国产精品涩涩涩视频网站 | 久久Av无码精品人妻系列| 日韩精品久久无码人妻中文字幕| 久久久精品人妻一区二区三区蜜桃 | 老司机午夜精品视频资源| 无码日韩精品一区二区免费暖暖| 色偷偷88888欧美精品久久久|