亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁(yè) web前端 js教程 Vue.js實(shí)戰(zhàn)案例詳解

Vue.js實(shí)戰(zhàn)案例詳解

May 12, 2018 pm 03:00 PM
javascript vue.js 詳解

這次帶給大家Vue.js實(shí)戰(zhàn)案例詳解,Vue.js實(shí)戰(zhàn)案例使用的注意事項(xiàng)有哪些,下面就是實(shí)戰(zhàn)案例,一起來(lái)看一下。

對(duì)大部分人來(lái)說(shuō),掌握Vue.js基本的幾個(gè)API後就已經(jīng)能夠正常地開(kāi)發(fā)前端網(wǎng)站。但如果你想更有效率地使用Vue來(lái)開(kāi)發(fā),成為Vue.js大師,那下面我要傳授的這五招你一定得認(rèn)真學(xué)習(xí)一下了。

第一個(gè)招:化繁為簡(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ù)的字面量名稱(chēng);其次,宣告immediate:true表示建立元件時(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>

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

招式解析:

我們需要藉助一下神器webpack,使用require.context() 方法來(lái)建立自己的(模組)上下文,從而實(shí)現(xiàn)自動(dòng)動(dòng)態(tài)require元件。這個(gè)方法需要3個(gè)參數(shù):要搜尋的資料夾目錄,是否還應(yīng)該搜尋它的子目錄,以及一個(gè)符合檔案的正規(guī)表示式。

我們?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)景真的是傷透了許多程式設(shè)計(jì)師的心...先默認(rèn)大家用的是Vue-router來(lái)實(shí)現(xiàn)路由的控制。

假設(shè)我們?cè)趯?xiě)一個(gè)部落格網(wǎng)站,需求是從/post-page/a,跳到/post-page/b。然後我們驚人的發(fā)現(xiàn),頁(yè)面跳轉(zhuǎn)後資料竟然沒(méi)更新? !原因是vue-router"智能地"發(fā)現(xiàn)這是同一個(gè)元件,然後它就決定要重複使用這個(gè)元件,所以你在created函數(shù)裡寫(xiě)的方法壓根就沒(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是解決了,可每次這麼寫(xiě)也太不優(yōu)雅了吧?秉持著能偷懶則偷懶的原則,我們希望程式碼這樣寫(xiě):

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ì)重新建立這個(gè)元件。 (雖然損失了一丟丟效能,但避免了無(wú)限的bug)。同時(shí),注意我將key直接設(shè)定為路由的完整路徑,一舉兩得。

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

第四個(gè)招: 無(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)建立HTML,而不是template。其實(shí)用js來(lái)產(chǎn)生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)我們寫(xiě)組件的時(shí)候,通常我們都需要從父組件傳遞一系列的props到子組件,同時(shí)父組件監(jiān)聽(tīng)子組件emit過(guò)來(lái)的一系列事件。舉例子:

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

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

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

<input
   :value="value"
   v-bind="$attrs"
   @input="$emit(&#39;input&#39;, $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í)和上面類(lèi)似,我完全沒(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)注php中文網(wǎng)其它相關(guān)文章!

推薦閱讀:

Vue三層嵌套路由使用心得

vue注冊(cè)組件使用步驟說(shuō)明

js支持post請(qǐng)求的跨域方法總結(jié)

以上是Vue.js實(shí)戰(zhàn)案例詳解的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線(xiàn)上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話(huà)題

Laravel 教程
1597
29
PHP教程
1488
72
Win11管理員權(quán)限取得詳解 Win11管理員權(quán)限取得詳解 Mar 08, 2024 pm 03:06 PM

Windows作業(yè)系統(tǒng)是全球最受歡迎的作業(yè)系統(tǒng)之一,其新版本W(wǎng)in11備受矚目。在Win11系統(tǒng)中,管理員權(quán)限的取得是一個(gè)重要的操作,管理員權(quán)限可以讓使用者對(duì)系統(tǒng)進(jìn)行更多的操作和設(shè)定。本文將詳細(xì)介紹在Win11系統(tǒng)中如何取得管理員權(quán)限,以及如何有效地管理權(quán)限。在Win11系統(tǒng)中,管理員權(quán)限分為本機(jī)管理員和網(wǎng)域管理員兩種。本機(jī)管理員是指具有對(duì)本機(jī)電腦的完全管理權(quán)限

Oracle SQL中的除法運(yùn)算詳解 Oracle SQL中的除法運(yùn)算詳解 Mar 10, 2024 am 09:51 AM

OracleSQL中的除法運(yùn)算詳解在OracleSQL中,除法運(yùn)算是一種常見(jiàn)且重要的數(shù)學(xué)運(yùn)算運(yùn)算,用來(lái)計(jì)算兩個(gè)數(shù)相除的結(jié)果。除法在資料庫(kù)查詢(xún)中經(jīng)常用到,因此了解OracleSQL中的除法運(yùn)算及其用法是資料庫(kù)開(kāi)發(fā)人員必備的技能之一。本文將詳細(xì)討論OracleSQL中除法運(yùn)算的相關(guān)知識(shí),並提供具體的程式碼範(fàn)例供讀者參考。一、OracleSQL中的除法運(yùn)算

PHP模運(yùn)算子的作用及用法詳解 PHP模運(yùn)算子的作用及用法詳解 Mar 19, 2024 pm 04:33 PM

PHP中的模運(yùn)算子(%)是用來(lái)取得兩個(gè)數(shù)值相除的餘數(shù)的。在本文中,我們將詳細(xì)討論模運(yùn)算子的作用及用法,並提供具體的程式碼範(fàn)例來(lái)幫助讀者更好地理解。 1.模運(yùn)算子的作用在數(shù)學(xué)中,當(dāng)我們將一個(gè)整數(shù)除以另一個(gè)整數(shù)時(shí),就會(huì)得到一個(gè)商和一個(gè)餘數(shù)。例如,當(dāng)我們將10除以3時(shí),商數(shù)為3,餘數(shù)為1。模運(yùn)算子就是用來(lái)取得這個(gè)餘數(shù)的。 2.模運(yùn)算子的用法在PHP中,使用%符號(hào)來(lái)表示模

vue.js vs.反應(yīng):特定於項(xiàng)目的考慮因素 vue.js vs.反應(yīng):特定於項(xiàng)目的考慮因素 Apr 09, 2025 am 12:01 AM

Vue.js適合中小型項(xiàng)目和快速迭代,React適用於大型複雜應(yīng)用。 1)Vue.js易於上手,適用於團(tuán)隊(duì)經(jīng)驗(yàn)不足或項(xiàng)目規(guī)模較小的情況。 2)React的生態(tài)系統(tǒng)更豐富,適合有高性能需求和復(fù)雜功能需求的項(xiàng)目。

linux系統(tǒng)呼叫system()函數(shù)詳解 linux系統(tǒng)呼叫system()函數(shù)詳解 Feb 22, 2024 pm 08:21 PM

Linux系統(tǒng)呼叫system()函數(shù)詳解系統(tǒng)呼叫是Linux作業(yè)系統(tǒng)中非常重要的一部分,它提供了一種與系統(tǒng)核心互動(dòng)的方式。其中,system()函數(shù)是常用的系統(tǒng)呼叫函數(shù)之一。本文將詳細(xì)介紹system()函數(shù)的使用方法,並提供對(duì)應(yīng)的程式碼範(fàn)例。系統(tǒng)呼叫的基本概念系統(tǒng)呼叫是使用者程式與作業(yè)系統(tǒng)核心互動(dòng)的一種方式。使用者程式透過(guò)呼叫系統(tǒng)呼叫函數(shù)來(lái)請(qǐng)求作業(yè)系統(tǒng)

Linux的curl指令詳解 Linux的curl指令詳解 Feb 21, 2024 pm 10:33 PM

Linux的curl命令詳解摘要:curl是一種強(qiáng)大的命令列工具,用於與伺服器進(jìn)行資料通訊。本文將介紹curl指令的基本用法,並提供實(shí)際的程式碼範(fàn)例,幫助讀者更好地理解和應(yīng)用該指令。一、curl是什麼? curl是命令列工具,用於發(fā)送和接收各種網(wǎng)路請(qǐng)求。它支援多種協(xié)議,如HTTP、FTP、TELNET等,並提供了豐富的功能,如檔案上傳、檔案下載、資料傳輸、代

Vue.js很難學(xué)習(xí)嗎? Vue.js很難學(xué)習(xí)嗎? Apr 04, 2025 am 12:02 AM

Vue.js不難學(xué),特別是對(duì)於有JavaScript基礎(chǔ)的開(kāi)發(fā)者。 1)其漸進(jìn)式設(shè)計(jì)和響應(yīng)式系統(tǒng)簡(jiǎn)化了開(kāi)發(fā)過(guò)程。 2)組件化開(kāi)發(fā)讓代碼管理更高效。 3)使用示例展示了基本和高級(jí)用法。 4)常見(jiàn)錯(cuò)誤可以通過(guò)VueDevtools調(diào)試。 5)性能優(yōu)化和最佳實(shí)踐如使用v-if/v-show和key屬性可提升應(yīng)用效率。

VUE是用於前端還是後端? VUE是用於前端還是後端? Apr 03, 2025 am 12:07 AM

Vue.js主要用於前端開(kāi)發(fā)。 1)它是一個(gè)輕量級(jí)且靈活的JavaScript框架,專(zhuān)注於構(gòu)建用戶(hù)界面和單頁(yè)面應(yīng)用。 2)Vue.js的核心是其響應(yīng)式數(shù)據(jù)系統(tǒng),數(shù)據(jù)變化時(shí)視圖自動(dòng)更新。 3)它支持組件化開(kāi)發(fā),UI可拆分為獨(dú)立、可複用的組件。

See all articles