vue.js初入門(十一組件-下篇)

2020-12-05 hojun

自定義事件

我們知道,父組件是使用 props 傳遞數據給子組件,但如果子組件要把數據傳遞迴去,應該怎樣做?那就是自定義事件!使用 v-on 綁定自定義事件每個 Vue 實例都實現了事件接口(Events interface),即:

使用 $on(eventName) 監聽事件使用 $emit(eventName) 觸發事件

另外,父組件可以在使用子組件的地方直接用 v-on 來監聽子組件觸發的事件。

舉個慄子:

如下:

給組件綁定原生事件

有時候,你可能想在某個組件的根元素上監聽一個原生事件。可以使用 .native 修飾 v-on 。例如:

使用自定義事件的表單輸入組件

自定義事件也可以用來創建自定義的表單輸入組件,使用 v-model 來進行數據雙向綁定。牢記,表單控制項進行數據綁定時的語法:

僅僅是一個語法糖:

所以在組件中使用時,它相當於下面的簡寫:

所以要讓組件的 v-model 生效,它必須:

接受一個 value 屬性在有新的 value 時觸發 input 事件

舉個慄子:

非父子組件通信

有時候非父子關係的組件也需要通信。在簡單的場景下,使用一個空的 Vue 實例作為中央事件總線:

使用 Slots 分發內容

在使用組件時,常常要像這樣組合它們:

注意兩點:

<app> 組件不知道它的掛載點會有什麼內容。掛載點的內容是由<app>的父組件決定的。<app> 組件很可能有它自己的模版。

為了讓組件可以組合,我們需要一種方式來混合父組件的內容與子組件自己的模板。這個過程被稱為 內容分發 (或 「transclusion」 如果你熟悉 Angular)。Vue.js 實現了一個內容分發 API ,參照了當前 Web組件規範草案,使用特殊的 <slot> 元素作為原始內容的插槽。

編譯作用域

在深入內容分發 API 之前,我們先明確內容的編譯作用域。假定模板為:

message 應該綁定到父組件的數據,還是綁定到子組件的數據?答案是父組件。組件作用域簡單地說是:

父組件模板的內容在父組件作用域內編譯;子組件模板的內容在子組件作用域內編譯。

一個常見錯誤是試圖在父組件模板內將一個指令綁定到子組件的屬性/方法:

假定 someChildProperty 是子組件的屬性,上例不會如預期那樣工作。父組件模板不應該知道子組件的狀態。

如果要綁定子組件內的指令到一個組件的根節點,應當在它的模板內這麼做:

類似地,分發內容是在父組件作用域內編譯。

單個 Slot

除非子組件模板包含至少一個 <slot> 插口,否則父組件的內容將會被丟棄。當子組件模板只有一個沒有屬性的 slot 時,父組件整個內容片段將插入到 slot 所在的 DOM 位置,並替換掉 slot 標籤本身。

最初在 <slot> 標籤中的任何內容都被視為備用內容。備用內容在子組件的作用域內編譯,並且只有在宿主元素為空,且沒有要插入的內容時才顯示備用內容。

假定 my-component 組件有下面模板:

父組件模版:

渲染結果:

具名Slots

元素可以用一個特殊的屬性 name 來配置如何分發內容。多個 slot 可以有不同的名字。具名 slot 將匹配內容片段中有對應 slot 特性的元素。

仍然可以有一個匿名 slot ,它是默認 slot ,作為找不到匹配的內容片段的備用插槽。如果沒有默認的 slot ,這些找不到匹配的內容片段將被拋棄。

例如,假定我們有一個 app-layout 組件,它的模板為:

父組件模版:

渲染結果為:

在組合組件時,內容分發 API 是非常有用的機制。

動態組件

多個組件可以使用同一個掛載點,然後動態地在它們之間切換。使用保留的

也可以直接綁定到組件對象上:

keep-alive如果把切換出去的組件保留在內存中,可以保留它的狀態或避免重新渲染。為此可以添加一個 keep-alive 指令參數:

雜項

編寫可復用組件在編寫組件時,記住是否要復用組件有好處。一次性組件跟其它組件緊密耦合沒關係,但是可復用組件應當定義一個清晰的公開接口。

Vue 組件的 API 來自三部分 - props, events 和 slots :

Props 允許外部環境傳遞數據給組件Events 允許組件觸發外部環境的副作用Slots 允許外部環境將額外的內容組合在組件中。

使用 v-bind 和 v-on 的簡寫語法,模板的縮進清楚且簡潔:

子組件索引

儘管有 props 和 events ,但是有時仍然需要在 JavaScript 中直接訪問子組件。為此可以使用 ref 為子組件指定一個索引 ID 。例如:

當 ref 和 v-for 一起使用時, ref 是一個數組或對象,包含相應的子組件。$refs 只在組件渲染完成後才填充,並且它是非響應式的。它僅僅作為一個直接訪問子組件的應急方案——應當避免在模版或計算屬性中使用 $refs。

異步組件

在大型應用中,我們可能需要將應用拆分為多個小模塊,按需從伺服器下載。為了讓事情更簡單, Vue.js 允許將組件定義為一個工廠函數,動態地解析組件的定義。Vue.js 只在組件需要渲染時觸發工廠函數,並且把結果緩存起來,用於後面的再次渲染。例如:

工廠函數接收一個 resolve 回調,在收到從伺服器下載的組件定義時調用。也可以調用 reject(reason) 指示加載失敗。這裡 setTimeout 只是為了演示。怎麼獲取組件完全由你決定。推薦配合使用 :Webpack 的代碼分割功能:

你可以使用 Webpack 2 + ES2015 的語法返回一個 Promise resolve 函數:

如果你是 Browserify 用戶,可能就無法使用異步組件了,它的作者已經表明 Browserify 是不支持異步加載的。如果這個功能對你很重要,請使用 Webpack。

組件命名約定

當註冊組件(或者 props)時,可以使用 kebab-case ,camelCase ,或 TitleCase 。Vue 不關心這個。

在 HTML 模版中,請使用 kebab-case 形式:

當使用字符串模式時,可以不受 HTML 的 case-insensitive 限制。這意味實際上在模版中,你可以使用 camelCase 、 PascalCase 或者 kebab-case 來引用你的組件和 prop:

如果組件未經 slot 元素傳遞內容,你甚至可以在組件名後使用 / 使其自閉合:

當然,這只在字符串模版中有效。因為自閉的自定義元素是無效的 HTML ,瀏覽器原生的解析器也無法識別它。

相關焦點

  • 什麼是VUE?VUE與JS的對比
    我們需要讓所有綁定的對象和元素都能感知到變化1.1.1. vue與js的對比1.1.1.1. js的實現(了解)<!引入js文件--><script src="../node_modules/vue/dist/vue.js"></script></head><body><!--2.
  • 如何寫一個vue組件專題及常見問題 - CSDN
    如何使用vue寫一個組件庫新建vue項目使用vue-cli初始化一個項目:vue init webpack VueComponentcd VueComponentnpm installnpm run dev以上就新建好了一個vue項目項目目錄首先,定義好目錄,經過觀察大多數的組件庫,基本是這樣的目錄
  • Vue.js 教程:構建一個特斯拉汽車餘電計算器
    作為本教程的起點,請克隆這個 Github 存儲庫:https://github.com/petereijgermans11/workshop-reactjs-vuejs然後轉至 vuejs-app 目錄。
  • 5分鐘帶你入門vuex(vue狀態管理)
    如果你之前使用過vue.js,你一定知道在vue中各個組件之間傳值的痛苦,在vue中我們可以使用vuex來保存我們需要管理的狀態值,值一旦被修改,所有引用該值的地方就會自動更新,那麼接下來我們就來學習一下vuex是如何修改狀態值的:我們新建一個vue項目(這裡由於我們是講解vuex,所以對於vue項目的創建我們不會講解太詳細);在命令行輸入 vue init
  • 4種可用於組織大型Vue.js項目的最佳實踐
    因此,本文將討論4種可用於組織大型Vue.js項目的最佳實踐。1.使用Vue Slots使代碼易於理解父子關係是組件之間相互連接的最常用方法之一,但有時這可能並不是最佳選擇。想像一下,如果出現在單個父組件中有大量子組件的情況,那麼可能就不得不使用大量道具和發出事件來處理這些子組件,很快一切會變得一團糟。
  • vue高級進階系列——用typescript玩轉vue和vuex
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫用過vue的朋友大概對vuex也不陌生,vuex的官方解釋是專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。
  • vue3.0手機聊天室|Vue3+Vant3仿微信界面
    項目簡介Vue3Chat是基於vue3.x+vuex4+vue-router4全家桶技術和vant3.x構建開發的一款mobile仿微信界面聊天實例。實現了發送圖文消息、圖片|視頻預覽、位置查看、紅包|朋友圈等功能。
  • Vue全家桶之什麼是Vuex
    Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。Vuex 是幹什麼的?試想一下,如果在一個項目開發中頻繁的使用組件傳參的方式來同步data中的值,一旦項目變得很龐大,管理和維護這些值將是相當棘手的工作。
  • Vue.js深入學習
    vue.jsv-cloak:解決網速慢閃爍問題 ,不會替換掉標籤裡面的內容v-text:會替換掉標籤裡面的內容:原樣輸出v-html:會解析標籤v-bind:綁定屬性的指令,縮寫.參數1,指令的名稱,定義的時候,指令的前面不需要加V-前綴,用的時候才加3.參數2,是一個對象,這個對象身上有一些指令相關的函數,這些函數在特定的階段執行相關的操作Vue.directive('focus',{bind:function(el){函數中第一個參數永遠是el,表示被綁定了指令的那個元素,是一個原生的js
  • ref vue 獲取文本專題及常見問題 - CSDN
    ref的官網介紹https://cn.vuejs.org/v2/api/#ref需求在普通的js操作中,一般都是直接操作dom元素,但是對於Vue.js框架來說,一般是不允許直接操作dom元素的。那麼其實Vue.js框架提供了ref獲取dom元素,以及組件引用。
  • slot vue 具名專題及常見問題 - CSDN
    vue的slot1、什麼是slotslot是插槽,插即是可以插入,槽就是坑,即是可以再代碼中插入如果子組件模板中不包含插口,那麼父組件的內容將會被丟棄。當子組件模板中有一個麼有屬性的插槽時,父組件傳入的整個內容片段,將插入到插槽所在的dom的位置,並替換掉插槽標籤本身。
  • 供我們選擇的 Vue 組件庫還有很多!
    Github star:27k+ 屬性:PC 端組件庫簡介:Vuetify 是 Vue.js 的頭號組件庫,自 2016 年以來一直在積極開發。這點可以說相當優秀,從他們的官方文檔上整齊的廣告可以看出,該組件庫受到廣大甲方的一致好評,紛紛投來廣告。在生態上做的也相當到位,甚至還有付費的主題。相應組件的文檔也非常詳細,有用例和 API 的解釋,在開發的過程中能減少很多不必要的麻煩。
  • Vue 3下element-ui用不了怎麼辦,element-plus來幫你
    在Vue 3的腳手架項目中,首先安裝element-plus的npm包,命令如下所示:npm install element-plus -S編輯main.js,引入整個element-plus組件和所需的樣式,由於element-plus組件內部默認使用英語,而我們項目需要使用中文
  • Angular、React 當前,Vue.js 優劣幾何?
    很多時候,人們不會給 Vue.js 足夠的關注。因此,我想分享一些有關 Vue.js 的信息,以及我在使用 Vue.js 來構建生產應用中獲得的一些個人經驗。現在讓我們一起來問這個問題:Vue.js 是適合你的框架嗎?注意:我並不想說 Vue.js 比 React、Angular 或者其它的任何前端框架好。這裡我分享的只是我在項目中使用 Vue.js 而獲得的一些個人體驗。
  • vue 具名插槽詳解專題及常見問題 - CSDN
    插槽含義:就是引入子組件後,在插入子組件元素中添加信息或者標籤,使得子組件的指定位置插入信息或者標籤插槽有三種:默認插槽、具名插槽、作用域插槽,由於vue2.6.0後對插槽進行修改,但是兼容2.6.0前的版本,博文中只說明2.6.0後的插槽,vue3.0後面會去除2.60前的版本兼容  一、默認插槽<
  • 在vue項目中使用vuex實現狀態管理的案例
    說明:其實如果項目不是很龐大很複雜,沒有涉及到很多狀態值需要被很多頁面或組件共用;或者某個頁面或組件的行為會對其他頁面或組件造成依賴性的影響。並不需要使用vuex。vuex的使用與否在實際開發中應該視項目情況而定。準備工作:a.在vue項目中安裝vuex: npm install vuex -S。b.了解下vuex的五個屬性。
  • 餓了麼公司前端團隊開源前端基於 Vue的桌面端組件庫-Element
    # npm i --save element-angular或者CDN目前可以通過 unpkg.com/element-ui 獲取到最新版本的資源,在頁面上引入 js 和 css 文件即可開始使用。<!
  • Vue 3 的最新進展
    Vue.js 作者尤雨溪近日介紹了 Vue 3 的最新進展。Vue Router目前存在部分與 vue-router@3.x 相關的路由鉤子(router hook)行為一致性問題,這也是 Vue Router 沒有被標記為 Beta 的原因。不過在非關鍵項目上可以使用新的路由。
  • template標籤 vue 作用專題及常見問題 - CSDN
    /vue.js"></script> <script type="text/javascript"> Vue.component('base-layout', { template: ` <div> <header> <slot
  • Vue+Axios+Vuex+Vux+Vue-Router全家桶搭建前端框架
    ;使用她能讓我們無需過多的分神去處理數據怎麼展示同步,讓我們專注於核心業務層;她的響應式足以讓我們爽飄飄~~a、現在我們看看如何快速搭建前端框架;首先我們實在node環境下開發,藉助webpack打包工具,安裝vue-cli;npm install -g vue-clib、安裝完成之後我們就能使用vue命令了;由於我們使用Vux2所以我們創建項目就是這樣