新聞中心
【稿件】前言

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、成都做網(wǎng)站、赤峰網(wǎng)絡(luò)推廣、小程序開發(fā)、赤峰網(wǎng)絡(luò)營銷、赤峰企業(yè)策劃、赤峰品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供赤峰建站搭建服務(wù),24小時服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
本文主要介紹屬性、事件和插槽這三個vue基礎(chǔ)概念、使用方法及其容易被忽略的一些重要細節(jié)。如果你閱讀別人寫的組件,也可以從這三個部分展開,它們可以幫助你快速了解一個組件的所有功能。
本文的代碼請猛戳github博客,紙上得來終覺淺,大家動手多敲敲代碼!
一、屬性
1.自定義屬性props
prop 定義了這個組件有哪些可配置的屬性,組件的核心功能也都是它來確定的。寫通用組件時,props 最好用對象的寫法,這樣可以針對每個屬性設(shè)置類型、默認值或自定義校驗屬性的值,這點在組件開發(fā)中很重要,然而很多人卻忽視,直接使用 props 的數(shù)組用法,這樣的組件往往是不嚴謹?shù)摹?/p>
- // 父組件
- :type='type'
- :is-visible="false"
- :on-change="handlePropChange"
- :list=[22,33,44]
- title="屬性Demo"
- class="test1"
- :class="['test2']"
- :style="{ marginTop: '20px' }" //注意:style 的優(yōu)先級是要高于 style
- style="margin-top: 10px">
- // 子組件
- props: {
- name: String,
- type: {
- //從父級傳入的 type,它的值必須是指定的 'success', 'warning', 'danger'中的一個,如果傳入這三個以外的值,都會拋出一條警告
- validator: (value) => {
- return ['success', 'warning', 'danger'].includes(value)
- }
- },
- onChange: {
- //對于接收的數(shù)據(jù),可以是各種數(shù)據(jù)類型,同樣也可以傳遞一個函數(shù)
- type: Function,
- default: () => { }
- },
- isVisible: {
- type: Boolean,
- default: false
- },
- list: {
- type: Array,
- // 對象或數(shù)組默認值必須從一個工廠函數(shù)獲取
- default: () => []
- }
- }
從上面的例子中,可以得出props 可以顯示定義一個或一個以上的數(shù)據(jù),對于接收的數(shù)據(jù),可以是各種數(shù)據(jù)類型,同樣也可以傳遞一個函數(shù)。
2.inheritAttrs
這是2.4.0 新增的一個API,默認情況下父作用域的不被認作 props 的特性綁定將會“回退”且作為普通的 HTML 特性應(yīng)用在子組件的根元素上。可通過設(shè)置 inheritAttrs 為 false,這些默認行為將會被去掉。注意:這個選項不影響 class 和 style 綁定。 上個例子中,title屬性沒有在子組件中props中聲明,就會默認掛在子組件的根元素上,如下圖所示:
3. data與props區(qū)別
- 相同點
兩者選項里都可以存放各種類型的數(shù)據(jù),當(dāng)行為操作改變時,所有行為操作所用到和模板所渲染的數(shù)據(jù)同時都會發(fā)生同步變化。
- 不同點
data 被稱之為動態(tài)數(shù)據(jù),在各自實例中,在任何情況下,我們都可以隨意改變它的數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu),不會被任何環(huán)境所影響。
props 被稱之為靜態(tài)數(shù)據(jù),在各自實例中,一旦在初始化被定義好類型時,基于 Vue 是單向數(shù)據(jù)流,在數(shù)據(jù)傳遞時始終不能改變它的數(shù)據(jù)類型,而且不允許在子組件中直接操作傳遞過來的props數(shù)據(jù),而是需要通過別的手段,改變傳遞源中的數(shù)據(jù)。至于如何改變,我們接下去詳細介紹。
4.單向數(shù)據(jù)流
這個概念出現(xiàn)在組件通信。props的數(shù)據(jù)都是通過父組件或者更高層級的組件數(shù)據(jù)或者字面量的方式進行傳遞的,不允許直接操作改變各自實例中的props數(shù)據(jù),而是需要通過別的手段,改變傳遞源中的數(shù)據(jù)。那如果有時候我們想修改傳遞過來的prop,有哪些辦法呢?
- 方法1:過渡到 data 選項中
在子組件的 data 中拷貝一份 prop,data 是可以修改的 。
- export default {
- props: {
- type: String
- },
- data () {
- return {
- currentType: this.type
- }
- }
- }
在 data 選項里通過 currentType接收 props中type數(shù)據(jù),相當(dāng)于對 currentType= type進行一個賦值操作,不僅拿到了 currentType的數(shù)據(jù),而且也可以改變 currentType數(shù)據(jù)。
- 方法2:利用計算屬性
- export default {
- props: {
- type: String
- },
- computed: {
- normalizedType: function () {
- return this.type.toUpperCase();
- }
- }
- }
以上兩種方法雖可以在子組件間接修改props的值,但如果子組件想修改數(shù)據(jù)并且同步更新到父組件,卻無濟于事。在一些情況下,我們可能會需要對一個 prop 進行『雙向綁定』,此時就推薦以下這兩種方法:
- 方法3:使用.sync
- // 父組件
父組件msg:{{ msg }}
父組件數(shù)組:{{ arr }}
- // 子組件
子組件msg:{{ msg }} 子組件數(shù)組:{{ arr }}- 改變文字
- // 子組件
// 將checked的值傳遞給父組件
值得注意:v-bind:style 的對象語法十分直觀——看著非常像 CSS,但其實是一個 JavaScript 對象。CSS 屬性名可以用駝峰式 (camelCase) 或短橫線分隔 (kebab-case,記得用引號括起來) 來命名。
2.新語法
在 2.6.0 中,我們?yōu)榫呙宀酆妥饔糜虿宀垡肓艘粋€新的統(tǒng)一的語法 (即 `v-slot` 指令)。它取代了 `slot` 和 `slot-scope` 。
我們通過一個例子介紹下默認插槽、具名插槽和作用域插槽的新語法:
- // 父組件
2.6 新語法
默認插槽:default slot
具名插槽:title slot1
具名插槽:title slot2
作用域插槽:item slot-scope {{ props }}
- // 子組件
- 
參考文章
- 珠峰架構(gòu)課(強烈推薦)
- Vue開發(fā)實戰(zhàn)
- Vue.js 組件精講
- Vue.js 官方文檔
- Vue 組件通信全揭秘
- vue修飾符--可能是東半球最詳細的文檔(滑稽)
浪里行舟:碩士研究生,專注于前端。個人公眾號:「前端工匠」,致力于打造適合初中級工程師能夠快速吸收的一系列優(yōu)質(zhì)文章!
【原創(chuàng)稿件,合作站點轉(zhuǎn)載請注明原文作者和出處為.com】
新聞名稱:詳解vue組件的三大核心概念
文章鏈接:http://m.5511xx.com/article/dpspcph.html


咨詢
建站咨詢
