如何開發(fā)自定義Vue組件(一):進度條組件组底?

如何引入vue.js

官網(wǎng):https://cn.vuejs.org/v2/guide/installation.html

官網(wǎng)有詳細的介紹携取,有多種方式滿足你的不同需求卿捎,我用的最簡單快捷的方法辽社,如直接<script>vue.js的地址(可以把vue.js下載下來放入靜態(tài)文件夾static下)</script>引入喘先,Vue 會被注冊為一個全局變量。

引入 <script src="/static/vue/vue.js"></script>

為什么要開發(fā)自定義組件解幽?

復(fù)用贴见,高效率,好維護躲株,方便協(xié)同開發(fā)片部。

了解Vue組件的組成部分

  • Template: 就是html。
  • Css: 為了讓html好看霜定。
  • Component: Vue組件的核心档悠,包含屬性、傳值望浩、方法辖所,其實就是把自定義組件注冊下,成為vue的一員磨德。

舉例說明:光線移動的進度條

star-progress.png

Template

在原progress的基礎(chǔ)上加上自定義的設(shè)置和css樣式奴烙。

<script type="x-template" id="star-progress-block">
    <ul class="border-box">
      <li style="font-size:40px;"><span v-text="perValue"></span></li>
      <li>
        <div>
          <progress class="progress-linear" :value="value - min" :max="max - min" style="width:100%"></progress>
          <div ref="star" class="star-light" v-bind:style="starStyle"></div>
        </div>
      </li>
      <li style="color:rgb(93,133,141);"><slot></slot></li>
    </ul>
</script>

Css

基礎(chǔ)樣式是bootstrap.css,再加上自定義樣式剖张。
考慮到瀏覽器兼容器性切诀,開發(fā)css需要多研究不同瀏覽器的特點,有針對的設(shè)置搔弄。

.border-box {
  height: 130px;
  padding: 20px;
  border: 1px solid rgb(45, 44, 60);
}

/*漸變+星光進度條*/
progress.progress-linear {
  width: 200px;
  height: 1px;
 color: #5D858D;
  /*兼容IE10的已完成進度背景*/
  border: none;
  background-color: #2D3C41;
  /*這個屬性也可當作Chrome的已完成進度背景幅虑,只不過被下面的::progress-bar覆蓋了*/
}

@keyframes foxfire-bg-gradient
{
  0%   {background-image: -moz-linear-gradient(0deg, #56BBCA 0%, #2D3C41 100%);}
  10%  {background-image: -moz-linear-gradient(0deg, #2D3C41 0%, #56BBCA 10%, #2D3C41 100%);}
  20%  {background-image: -moz-linear-gradient(0deg, #2D3C41 0%, #56BBCA 20%, #2D3C41 100%);}
  30%  {background-image: -moz-linear-gradient(0deg, #2D3C41 0%, #56BBCA 30%, #2D3C41 100%);}
  40%  {background-image: -moz-linear-gradient(0deg, #2D3C41 0%, #56BBCA 40%, #2D3C41 100%);}    
  50%  {background-image: -moz-linear-gradient(0deg, #2D3C41 0%, #56BBCA 50%, #2D3C41 100%);}
  60%  {background-image: -moz-linear-gradient(0deg, #2D3C41 0%, #56BBCA 60%, #2D3C41 100%);}
  70%  {background-image: -moz-linear-gradient(0deg, #2D3C41 0%, #56BBCA 70%, #2D3C41 100%);}
  80%  {background-image: -moz-linear-gradient(0deg, #2D3C41 0%, #56BBCA 80%, #2D3C41 100%);}
  90%  {background-image: -moz-linear-gradient(0deg, #2D3C41 0%, #56BBCA 90%, #2D3C41 100%);}
  100% {background-image: -moz-linear-gradient(0deg, #2D3C41 0%, #56BBCA 100%);}
}

@keyframes chrome-bg-gradient
{
  0%   {background-image: -webkit-linear-gradient(0deg, #56BBCA 0%, #2D3C41 100%);}
  10%  {background-image: -webkit-linear-gradient(0deg, #2D3C41 0%, #56BBCA 20%, #2D3C41 100%);}
  20%  {background-image: -webkit-linear-gradient(0deg, #2D3C41 0%, #56BBCA 40%, #2D3C41 100%);}
  30%  {background-image: -webkit-linear-gradient(0deg, #2D3C41 0%, #56BBCA 60%, #2D3C41 100%);}
  40%  {background-image: -webkit-linear-gradient(0deg, #2D3C41 0%, #56BBCA 80%, #2D3C41 100%);}    
  50%  {background-image: -webkit-linear-gradient(0deg, #2D3C41 0%, #56BBCA 100%);}
  60%  {background-image: -webkit-linear-gradient(0deg, #2D3C41 0%, #56BBCA 80%, #2D3C41 100%);}
  70%  {background-image: -webkit-linear-gradient(0deg, #2D3C41 0%, #56BBCA 60%, #2D3C41 100%);}
  80%  {background-image: -webkit-linear-gradient(0deg, #2D3C41 0%, #56BBCA 40%, #2D3C41 100%);}
  90%  {background-image: -webkit-linear-gradient(0deg, #2D3C41 0%, #56BBCA 20%, #2D3C41 100%);}
  100% {background-image: -webkit-linear-gradient(0deg, #56BBCA 0%, #2D3C41 100%);}
}

.star-light {
  position: relative;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background-color: #ECFABD;
}
/*firefox*/
progress.progress-linear::-moz-progress-bar {
 animation-name: foxfire-bg-gradient;
  animation-duration: 3s;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}

/*chrome*/
progress.progress-linear::-webkit-progress-bar {
  background-color: #2D3C41;
  /*背景顏色*/
}

progress.progress-linear::-webkit-progress-value {
  animation-name: chrome-bg-gradient;
  animation-duration: 3s;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}

Component

為了讓新組件成為vue的一員,所以需要注冊顾犹。
其中props用于接收來自父組件的數(shù)據(jù)倒庵。官網(wǎng)舉了props使用例子以及命名大小寫的說明。
camelCase (駝峰命名法) 的 prop 名需要使用其等價的 kebab-case (短橫線分隔命名) 命名炫刷。
舉例:prop:myName -> DOM: my-name

官網(wǎng):https://cn.vuejs.org/v2/guide/components-props.html

通過該組件可以更直觀的發(fā)現(xiàn)擎宝,類似于為新組件增加了新屬性,為了便于理解浑玛,我是這么說服自己的绍申。
當然在以后的項目中,會再次發(fā)現(xiàn)props的用處確實是父組件傳遞值到子組件中顾彰。特別是當一個.vue文件作為組件的時候极阅,尤其明顯。而且這種傳值是單向的涨享,父傳子筋搏。

Vue.component('star-progress-block', {
  data: function () {
    return {}
  },
  props: {
    min: {
      type: Number,
      default: 0
    },
    max: {
      type: Number,
      default: 100,
    },
    value: {
      type: Number,
      default: 0,
    },
    perValue: {
      type: String,
      default: ''
    }
  },
  computed: {
    'starStyle': function() {
      var top = '-5px', left = '' + ((this.value - this.min)/(this.max - this.min)) * 100 + '%'

      return {top, left}
    }
  },
  template:'#star-progress-block' // 也可以把star-progress-block內(nèi)容貼這,用單引號或反單引號括起來厕隧,像這樣: ` <ul>...</ul>`
})

到此奔脐,新的進度條組件就開發(fā)完成了俄周,怎么應(yīng)用呢?

如何應(yīng)用自定義組件髓迎?

Html

像html普通組件一樣使用栈源,傳值通過vue實例的data數(shù)據(jù),這是雙向綁定的竖般。vue框架是MVVM模式,所以決定了數(shù)據(jù)是雙向綁定的茶鹃,這是另一個課題涣雕,有興趣自行查閱資料。

<div class="col-md-3 first">
  <star-progress-block 
     :value="rate"
     :min="rateMin"
     :max="rateMax"
     :per-value="rateValue">
      測試
    </star-progress-block>
  </div>

Script

既然需要vue實例闭翩,所以new一個實例挣郭,設(shè)置data數(shù)據(jù),即可顯示進度條的數(shù)值疗韵。

var v = new Vue({
  el: '#app',
  data: {      
    rate: 0,
    rateMin: 0,
    rateMax: 100,
    rateValue: '準備中'
 }
 ....

總結(jié)

在之前的項目中開發(fā)了多個vue自定義組件兑障,像進度條,菜單欄蕉汪,時間框等流译,覺得有必要重新整理思路以備以后查閱,也希望有志同道合的人一起討論者疤。

前端開發(fā)變化多端福澡,新技術(shù)層出不窮,宗旨只有一個驹马,那就是更方便更快捷的開發(fā)出所需的頁面革砸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市糯累,隨后出現(xiàn)的幾起案子算利,更是在濱河造成了極大的恐慌,老刑警劉巖泳姐,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件效拭,死亡現(xiàn)場離奇詭異,居然都是意外死亡胖秒,警方通過查閱死者的電腦和手機允耿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扒怖,“玉大人较锡,你說我怎么就攤上這事〉裂鳎” “怎么了蚂蕴?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵低散,是天一觀的道長。 經(jīng)常有香客問我骡楼,道長熔号,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任鸟整,我火速辦了婚禮引镊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘篮条。我一直安慰自己弟头,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布涉茧。 她就那樣靜靜地躺著赴恨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伴栓。 梳的紋絲不亂的頭發(fā)上伦连,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音钳垮,去河邊找鬼惑淳。 笑死,一個胖子當著我的面吹牛饺窿,可吹牛的內(nèi)容都是我干的汛聚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼短荐,長吁一口氣:“原來是場噩夢啊……” “哼倚舀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起忍宋,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤痕貌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后糠排,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舵稠,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年入宦,在試婚紗的時候發(fā)現(xiàn)自己被綠了哺徊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡乾闰,死狀恐怖落追,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涯肩,我是刑警寧澤轿钠,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布巢钓,位于F島的核電站,受9級特大地震影響疗垛,放射性物質(zhì)發(fā)生泄漏症汹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一贷腕、第九天 我趴在偏房一處隱蔽的房頂上張望背镇。 院中可真熱鬧,春花似錦泽裳、人聲如沸瞒斩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荠割,卻和暖如春妹卿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蔑鹦。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工夺克, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嚎朽。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓铺纽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哟忍。 傳聞我的和親對象是個殘疾皇子狡门,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容