vue2.X組件學(xué)習(xí)心得(新手必看篇)
VUEJS學(xué)習(xí)網(wǎng)址:https://cn.vuejs.org/
此文章是用來(lái)記錄自己的學(xué)習(xí)和實(shí)踐心得。
關(guān)注點(diǎn):父子組件之間的通信
看圖說(shuō)話(huà):

Pass Props
子組件本身與父組件是孤立的,通過(guò)子組件中顯示聲明的props屬性,接收父組件數(shù)據(jù);
父組件的數(shù)據(jù)更新時(shí),子組件的prop會(huì)跟著更新;
此數(shù)據(jù)流動(dòng)是單向的(看著);
Emit Events
子組件使用$.emit(fn)向外拋出自己的內(nèi)部觸發(fā)的事件;
父組件是否監(jiān)聽(tīng)?如果父組件需要監(jiān)聽(tīng),使用v-on綁定監(jiān)聽(tīng),觸發(fā)對(duì)應(yīng)事件;
以上為通用語(yǔ),具體分析
子組件可以接收一個(gè)字符串,在子組件內(nèi)部可以用{{label}}使用
<v-input label="姓名"></v-input>
子組件可以接收動(dòng)態(tài)參數(shù)
<input v-model="msg" /> <v-profile :message="msg"></v-profile>
子組件接收到數(shù)據(jù)之后想處理一下不小心改了怎么辦?
給prop創(chuàng)建一個(gè)副本(建議深拷貝),處理副本,不動(dòng)prop;
父組件的數(shù)據(jù)改變后,子組件的prop會(huì)自動(dòng)更新,但是這個(gè)prop的副本不會(huì)???
使用watch監(jiān)聽(tīng)這個(gè)prop,改變時(shí)更新副本;
子組件的prop副本改變了想要通知父組件怎么辦?
使用watch監(jiān)聽(tīng)這個(gè)副本,改變時(shí)向外拋出自己的內(nèi)部觸發(fā)的事件;
。。。
其實(shí)以上???在2.3有了更好的方法,之前的就是看看。
.sync修飾符
***父組件***
<input v-model="msg" />
<v-profile :message.sync="msg"></v-profile>
***子組件***
$.emit('update:message',newValue)
我是用了一下然后喜聞樂(lè)見(jiàn)的修改成功了,但是打開(kāi)控制臺(tái)有報(bào)錯(cuò)?。?!
vue.esm.js?65d7:434 [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "message"
子組件想要觸發(fā)父組件可以emit(父組件需要監(jiān)聽(tīng)才會(huì)觸發(fā)),父組件觸發(fā)子組件事件呢?
通過(guò)在引用的子組件上使用ref屬性實(shí)現(xiàn)父組件調(diào)用子組件的方法以及屬性
但是!$refs 只在組件渲染完成后才填充,并且它是非響應(yīng)式的。它僅僅作為一個(gè)直接訪(fǎng)問(wèn)子組件的應(yīng)急方案——應(yīng)當(dāng)避免在模版或計(jì)算屬性中使用 $refs 。
關(guān)注點(diǎn):非父子組件之間的通信
使用空的vue實(shí)例作為中央事件總線(xiàn)
var bus = new Vue();
// 觸發(fā)組件 A 中的事件
bus.$emit('id-selected', 1)
// 在組件 B 創(chuàng)建的鉤子中監(jiān)聽(tīng)事件
bus.$on('id-selected', function (id) {
// ...
})
考慮vuex
關(guān)注點(diǎn):在組件中使用slot
首先,在父組件中給子組件標(biāo)簽中間放置內(nèi)容是無(wú)效的。然后slot出場(chǎng)。
白話(huà)版本:
匿名slot: slot標(biāo)簽存在與子組件template中; 子組件在父組件中使用的時(shí)候,子組件標(biāo)簽中的結(jié)構(gòu)會(huì)在編譯后替換子組件的slot標(biāo)簽; 如果子組件中沒(méi)有slot,則父組件中子組件標(biāo)簽中的內(nèi)容會(huì)消失; 具名slot: 顧名思義,是具有name屬性的slot標(biāo)簽;并有匿名組件的特性(以上); 子組件在父組件中使用的時(shí)候,子組件中的結(jié)構(gòu)中會(huì)有某些標(biāo)簽擁有slot屬性并賦值,這些會(huì)在編譯后替換子組件的相應(yīng)slot標(biāo)簽;
一句話(huà)解釋?zhuān)褐饕膬?nèi)容是寫(xiě)在父組件中的子組件標(biāo)簽中,編譯后插入子組件的相應(yīng)位置
講真,說(shuō)到這里我自己都不明白要slot干嘛。
官方給了個(gè)布局的例子:
<div class="container"> <header> <slot name="header"></slot> </header> <main> <slot></slot> </main> <footer> <slot name="footer"></slot> </footer> </div>
<app-layout> <h1 slot="header">這里可能是一個(gè)頁(yè)面標(biāo)題</h1> <p>主要內(nèi)容的一個(gè)段落。</p> <p>另一個(gè)主要段落。</p> <p slot="footer">這里有一些聯(lián)系信息</p> </app-layout>
但是好像也沒(méi)什么好推薦的。(個(gè)人看法)
再想想:
子組件的template中至少有一個(gè)slot標(biāo)簽,slot標(biāo)簽中的內(nèi)容是default content。什么場(chǎng)景能用到呢?我想到了剛剛寫(xiě)的表格數(shù)據(jù)篩選,當(dāng)時(shí)用的是v-if,v-else。如果改成slot呢。。。
作用域插槽
語(yǔ)法:
<template scope="props"> ... </template>
——————這個(gè)官網(wǎng)例子我是好半天才明白
<my-awesome-list :items="items">
<!-- 作用域插槽也可以是具名的 -->
<template slot="item" scope="props">
<li class="my-fancy-item">{{ props.text }}</li>
</template>
</my-awesome-list>
以上的template中的props其實(shí)和子組件的props屬性是相同的,子組件傳遞了什么prop,它就接收什么,像是下邊的傳了個(gè)text
<ul> <slot name="item" v-for="item in items" :text="item.text"> <!-- 這里寫(xiě)入備用內(nèi)容 --> </slot> </ul>
我看了很長(zhǎng)很長(zhǎng)時(shí)間,為什么要這么拐個(gè)彎呢。。。
————一夜過(guò)后—————
這樣內(nèi)容更靈活:數(shù)據(jù)是相同的(父組件提供數(shù)據(jù)),子組件負(fù)責(zé)了循環(huán)(添加邏輯),父組件引用子組件時(shí)插入的作用域插槽的模板決定了(展示的形式)!這分工?。?!點(diǎn)個(gè)贊!??!
我修改了一下自己的table然后頁(yè)面展示了個(gè)空白。之后發(fā)現(xiàn)問(wèn)題出在子組件往外傳數(shù)據(jù)的時(shí)候變量名不能用"name"。修改掉。
關(guān)注點(diǎn):動(dòng)態(tài)組件使用
通過(guò)使用保留的 <component> 元素,動(dòng)態(tài)地綁定到它的 is 特性,我們讓多個(gè)組件可以使用同一個(gè)掛載點(diǎn),并動(dòng)態(tài)切換:很適用于制作Tab類(lèi)的效果
<component v-bind:is="currentView" :data1="data1" :data2="data2"> <!-- 組件在 vm.currentview 變化時(shí)改變! --> </component>
在methods屬性中定義一個(gè)函數(shù)修改currentView即可。
視情況可以配合 keep-alive 避免重新渲染
在子組件上放置activate鉤子做切換時(shí)的工作:done() //放到鉤子最后,表示執(zhí)行工作完畢,可以切換組件,配合keep-alive使用,activate鉤子只執(zhí)行一次
子組件接收數(shù)據(jù)和以往相同,只是這一次都寫(xiě)在了component中,只是如此的話(huà),每個(gè)子組件都需要有這些接口(prop)
暫時(shí)說(shuō)到這里,突然得回頭看一下react,沒(méi)時(shí)間了,回頭會(huì)繼續(xù)。
以上這篇vue2.X組件學(xué)習(xí)心得(新手必看篇)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue.js實(shí)現(xiàn)格式化時(shí)間并每秒更新顯示功能示例
這篇文章主要介紹了vue.js實(shí)現(xiàn)格式化時(shí)間并每秒更新顯示功能,結(jié)合實(shí)例形式分析了vue.js時(shí)間格式化顯示與基于定時(shí)器進(jìn)行實(shí)時(shí)更新的相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
Vue2中的過(guò)濾器filter使用及注意說(shuō)明
這篇文章主要介紹了Vue2中的過(guò)濾器filter使用及注意說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
vue數(shù)據(jù)初始化initState的實(shí)例詳解
Vue 實(shí)例在建立的時(shí)候會(huì)運(yùn)行一系列的初始化操作,而在這些初始化操作里面,和數(shù)據(jù)綁定關(guān)聯(lián)最大的是 initState。這篇文章主要介紹了vue數(shù)據(jù)初始化--initState,需要的朋友可以參考下2019-04-04
Element-UI 多個(gè)el-upload組件自定義上傳不用上傳url并且攜帶自定義傳參(文件序號(hào))
有多個(gè)upload組件,每個(gè)都需要單獨(dú)上傳獲取文件(JS File類(lèi)型),不需要action上傳到指定url,自定義上傳動(dòng)作和http操作,下面通過(guò)本文給大家分享Element-UI 多個(gè)el-upload組件自定義上傳不用上傳url并且攜帶自定義傳參(文件序號(hào)),感興趣的朋友一起看看吧2024-06-06
element-ui?tree?手動(dòng)展開(kāi)功能實(shí)現(xiàn)(異步樹(shù)也可以)
這篇文章主要介紹了element-ui?tree?手動(dòng)進(jìn)行展開(kāi)(異步樹(shù)也可以),項(xiàng)目中用到了vue的element-ui框架,用到了el-tree組件,需要的朋友可以參考下2022-08-08
vue2使用element-ui,el-table不顯示,用npm安裝方式
這篇文章主要介紹了vue2使用element-ui,el-table不顯示,用npm安裝方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Vue后臺(tái)管理系統(tǒng)權(quán)限控制與動(dòng)態(tài)路由的實(shí)現(xiàn)
本文主要介紹了Vue后臺(tái)管理系統(tǒng)權(quán)限控制與動(dòng)態(tài)路由的實(shí)現(xiàn),可以根據(jù)用戶(hù)的角色靈活控制頁(yè)面訪(fǎng)問(wèn)權(quán)限,提高系統(tǒng)的安全性和用戶(hù)體驗(yàn),感興趣的可以了解一下2025-04-04
vue的列表交錯(cuò)過(guò)渡實(shí)現(xiàn)代碼示例
這篇文章主要介紹了vue的列表交錯(cuò)過(guò)渡實(shí)現(xiàn)代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05

