今天小編給大家分享一下Vue項(xiàng)目中常用的實(shí)用技巧有哪些的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名與空間、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、方城網(wǎng)站維護(hù)、網(wǎng)站推廣。
先聊聊如何傳遞 Prop,可以分為靜態(tài)和動態(tài)的 Prop:
了解了 Props 的傳遞方式,在看看官方文檔是怎么定義 $attrs 的, 在尤大大的文檔中這樣介紹了 $attrs:
$attrs: 包含了父作用域中不作為 prop 被識別 (且獲取) 的 attribute 綁定 class 和 style 除外)。當(dāng)一個組件沒有聲明任何 prop 時,這里會包含所有父作用域的綁定 (class 和 style 除外),并且可以通過 v-bind="$attrs" 傳入內(nèi)部組件
$attrs 包含了傳入到父作用域中沒有在 props 聲明的其他 props,因此我們可以用 $attrs 去代替那些父組件中不需要的而子組件需要的 props, 通過 v-bind="$attrs" 統(tǒng)一傳遞給后代。這樣就避免了一個個聲明然后再一個個傳遞。
上面這一行代碼就通過 v-bind="$attrs" 的方式將本作用域中不作為 prop 的其他屬性傳遞給了 blog-post 組件。
父組件通過 $attrs 傳遞給后代組件后,后代組件如果想通過觸發(fā)事件來更新父組件狀態(tài)該如何處理?如果一級一級地往上 emit 事件,會不會弄得代碼太繁瑣復(fù)雜了?在 Vue 中可以通過 $listeners 解決這個問題,先看看官方文檔關(guān)于 $listeners 的說明:
包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監(jiān)聽器。它可以通過 v-on="$listeners" 傳入內(nèi)部組件——在創(chuàng)建更高層次的組件時非常有用。
文檔中說了 $listeners 包含了父作用域中的事件監(jiān)聽器。意思就是 $listeners 表示了父組件中的事件監(jiān)聽器集合,只要是觸發(fā)父組件的事件,而不是自己的,就可以用一個 v-on="$listeners"表示。
{{ title }}
上面的代碼示例中,中間層的組件內(nèi)通過 v-bind="$attrs" 將其余的 Prop 傳遞給了 Child 組件,再通過 v-on="$listeners" 綁定父作用域中的事件監(jiān)聽器,一旦 emit 就會傳給了父組件。
有很多這樣的場景,父組件需要傳遞數(shù)據(jù)給子組件,且在子組件觸發(fā)數(shù)據(jù)更新的時候,馬上反饋給父組件,父組件數(shù)據(jù)更新,單向數(shù)據(jù)流向子組件,最后子組件更新。通常情況用 props + $emit 的方式去更新狀態(tài),但是這種處理方式有點(diǎn)笨拙,且不易維護(hù),所以可以通過實(shí)現(xiàn)數(shù)據(jù)的“雙向綁定”來提高代碼的可維護(hù)性??梢酝ㄟ^這以下方式去實(shí)現(xiàn):
在 v-bind prop的時候添加 .sync 修飾符,賦新值的時候用 this.$emit('update:propName', newValue)
如果要更新上述代碼中的 title 值,只需要 this.$emit('update:title', '新標(biāo)題'),完成數(shù)據(jù)更新。
model 是2.2.0+ 新增的選項(xiàng),一個組件上的 v-model 默認(rèn)會利用名為 value 的 Prop 和名為 input 的事件, 而 model 選項(xiàng)可以規(guī)定 Prop 名稱和事件名稱來實(shí)現(xiàn) v-model,好處是在實(shí)現(xiàn) v-model 的同時也避免了 Prop 和事件名的沖突。
自定義組件的 v-model
checked {{checked}}
如果只需要一個的話,也可以直接繼承
在遇到功能點(diǎn)多,代碼量大的頁面時,我們可以利用 Mixin 抽離一些功能點(diǎn),通過文件去管理這些功能,這樣會比較方便去管理代碼。
組件在加載都是同步的,但當(dāng)頁面內(nèi)容很多,有些組件并不需要一開始就加載出來的比如彈窗類的組件,這些就可以用動態(tài)組件,當(dāng)用戶執(zhí)行了某些操作后再加載出來,這樣可以提高主模塊加載的性能, 在 Vue 中可以使用 component 動態(tài)組件, 依 is 的值,來決定哪個組件被渲染。
主頁面
示例代碼中,只有當(dāng)點(diǎn)擊的時候才會去加載組件。component 還可以配合 v-show 去控制顯示和隱藏,這樣這個component 只會 mounted 一次,優(yōu)化性能。
有很多場景想更改 UI 組件樣式,然后怕影響別人的使用,加上 scoped 后又不能生效,可以使用 ::v-deep 深度作用選擇器去修改組件作用域內(nèi)的 CSS 的樣式。在 CSS 中我們可以使用 >>> 操作符,但在預(yù)處理器中的寫法就要用 /deep/ 或 ::v-deep。
::v-deep 和 /deep/ 作用是一樣的,但不推薦使用 /deep/, 在 Vue3.0 中將不支持 /deep/ 這種寫法。
裝飾器增加了代碼的可讀性,清晰地表達(dá)了意圖,而且提供一種方便的手段,增加或修改類的功能,比如給類其中的方法提供防抖的功能。
import debounce from 'lodash.debounce'; export function Debounce(delay: number, config: object = {}) { return (target: any, prop: string) => { return { value: debounce(target[prop], delay, config), }; }; }
這樣的好處是使用起來非常方便,另外增加了代碼的可讀性。
@Debounce(300) onIdChange(val: string) { this.$emit('idchange', val); }
關(guān)于 require.context,webpack 文檔是這么描述的:
可以給這個函數(shù)傳入三個參數(shù):一個要搜索的目錄,一個標(biāo)記表示是否還搜索其子目錄, 以及一個匹配文件的正則表達(dá)式。
webpack 會在構(gòu)建中解析代碼中的 require.context() 。如果想引入一個文件夾下面的所有文件,或者引入能匹配一個正則表達(dá)式的所有文件,這個功能就會很有幫助
根據(jù)這個提示,我們可以引用到一個文件夾下面的所有文件,由此可以利用獲取的文件信息去做一些操作,比如在注冊組件的時候,原本我們注冊組件的時候需要一個個引入并且一個個注冊,而且后面想加新的,又要再寫上,現(xiàn)在可以通過 require.context 去優(yōu)化這一段代碼。
// import WmsTable from './wms-table/table/index'; import Table from './table/index.vue'; import CustomHooks from './custom-hooks/custom-hooks-actions/index'; import SFilter from './s-filter/filter-form'; import WButton from './button/index'; import CreateForm from './createForm/create-form/CreateForm.vue'; import Action from './table/action-table-column.vue'; import DetailItem from './detail-item.vue'; Vue.component('w-filter', SFilter); Vue.component('w-button', WButton); Vue.component('custom-hooks', CustomHooks); Vue.component('create-form', CreateForm); Vue.component('w-table', Table); Vue.component('w-table-action', Action); Vue.component('zonetime-date-picker', ZonetimeDatePicker); Vue.component('detail', DetailItem);
注冊全局組件的時候,不需要一個一個 import,和一個個去注冊,使用 require.context 可以自動導(dǎo)入模塊,這樣的好處在于,當(dāng)我們新建一個組件,不用自己再去手寫注冊,而在一開始就幫我們自動完成。
const contexts = require.context('./', true, /\.(vue|ts)$/); export default { install (vm) { contexts.keys().forEach(component => { const componentEntity = contexts(component).default; if (componentEntity.name) { vm.component(componentEntity.name, componentEntity); } }); } };
以上就是“Vue項(xiàng)目中常用的實(shí)用技巧有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。