快速原型開發(fā)

VueCli提供一個(gè)插件可以進(jìn)行原型快速開發(fā)

  • 安裝

    npm install -g @vue/cli-service-global
    
  • 使用 vue serve

    在開發(fā)環(huán)境模式下零配置為 .js 或 .vue 文件啟動一個(gè)服務(wù)器
    
    Options:
    
      -o, --open  打開瀏覽器
      -c, --copy  將本地 URL 復(fù)制到剪切板
      -h, --help  輸出用法信息
    
  • 創(chuàng)建App.vue文件

    <template>
      <h1>Hello!</h1>
    </template>
    
  • 運(yùn)行

    vue serve
    

    vue serve會在當(dāng)前目錄自動推導(dǎo)入口文件——入口可以是 main.js粱檀、index.js芬探、App.vueapp.vue 中的一個(gè)

    可以顯式地指定入口文件:

    vue serve MyComponent.vue
    
安裝ElementUI
  • 創(chuàng)建文件肩祥,初始化package.json

    mkdir custom-component
    cd custom-component
    yarn init -y
    
  • 安裝ElementUI

    vue add element
    
  • 創(chuàng)建main.js竹宋,加載ElementUI叼耙,使用Vue.use()安裝插件

    import Vue from 'vue'
    import ElementUI from 'element-ui'
    import 'element-ui/lib/theme-chalk/index.css'
    import Login from './src/Login.vue'
    
    Vue.use(ElementUI)
    
    new Vue({
      el: '#app',
      render: h => h(Login)
    })
    
  • 創(chuàng)建src/Login.vue鼻疮,并使用vue serve運(yùn)行

    <template>
      <el-form class="form" ref="form" :model="user" :rules="rules">
        <el-form-item label="用戶名" prop="username">
          <el-input v-model="user.username"></el-input>
        </el-form-item>
        <el-form-item label="密碼" prop="password">
          <el-input type="password" v-model="user.password"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="login">登 錄</el-button>
        </el-form-item>
      </el-form>
    </template>
    
    <script>
    export default {
      name: 'Login',
      data() {
        return {
          user: {
            username: '',
            password: '',
          },
          rules: {
            username: [
              {
                required: true,
                message: '請輸入用戶名',
              },
            ],
            password: [
              {
                required: true,
                message: '請輸入密碼',
              },
              {
                min: 6,
                max: 12,
                message: '請輸入6-12位密碼',
              },
            ],
          },
        }
      },
      methods: {
        login() {
          this.$refs.form.validate((valid) => {
            if (valid) {
              alert('驗(yàn)證成功')
            } else {
              alert('驗(yàn)證失敗')
              return false
            }
          })
        },
      },
    }
    </script>
    
    <style>
    .form {
      width: 30%;
      margin: 150px auto;
    }
    </style>
    
組件開發(fā)
步驟條組件
  • 創(chuàng)建Steps.vue

    <template>
      <div class="lg-steps">
        <div class="lg-steps-line"></div>
        <div
          class="lg-step"
          v-for="index in count"
          :key="index"
          :style="{ color: active >= index ? activeColor : defaultColor }"
        >
          {{ index }}
        </div>
      </div>
    </template>
    
    <script>
    import './steps.css'
    export default {
      name: 'LgSteps',
      props: {
        count: {
          type: Number,
          default: 3,
        },
        active: {
          type: Number,
          default: 0,
        },
        activeColor: {
          type: String,
          default: 'red',
        },
        defaultColor: {
          type: String,
          default: 'green',
        },
      },
    }
    </script>
    <style></style>
    

    使用vue serve ./Steps.vue運(yùn)行琳水,打開頁面訪問此組件

  • 創(chuàng)建Steps-test.vue組件,進(jìn)行測試

    <template>
      <div>
        <steps :count="count" :active="active"></steps>
        <button @click="next">下一步</button>
      </div>
    </template>
    
    <script>
    import Steps from './Steps.vue'
    export default {
      components: {
        Steps,
      },
      data() {
        return {
          count: 4,
          active: 0,
        }
      },
      methods: {
        next() {
          if (this.active < this.count) {
            this.active++
          }
        },
      },
    }
    </script>
    <style></style>
    
表單組件
  • 模仿Element的Form組件吊档,在src下創(chuàng)建form文件夾

  • 創(chuàng)建Form.vue篙议、FormItem.vue、Input.vue以及Button.vue組件

    <!-- Form.vue -->
    <template>
      <form>
        <slot></slot>
      </form>
    </template>
    
    <script>
    export default {
      name: 'wangForm',
      props: {
        model: {
          type: Object
        },
        rules: {
          type: Object
        }
      }
    }
    
    </script>
    <style>
    </style>
    <!-- FormItem.vue -->
    <template>
      <div>
        <label>{{ label }}</label>
        <div>
          <slot></slot>
          <p v-if="errMessage">{{ errMessage }}</p>
        </div>
      </div>
    </template>
    
    <script>
    export default {
      name: 'wangFormItem',
      props: {
        label: {
          type: String
        },
        prop: {
          type: String
        }
      },
      data () {
        return {
          errMessage: ''
        }
      }
    }
    </script>
    
    <style>
    </style>
    <!-- Input.vue -->
    <template>
      <div>
        <input v-bind="$attrs" :type="type" :value="value" @input="handleInput">
      </div>
    </template>
    
    <script>
    export default {
      name: 'wangInput',
      // 禁用父組件默認(rèn)屬性
      inheritAttrs: false,
      props: {
        value: {
          type: String
        },
        type: {
          type: String,
          default: 'text'
        }
      },
      methods: {
        handleInput (evt) {
          this.$emit('input', evt.target.value)
        }
      }
    }
    </script>
    <style>
    </style>
    <!-- Button.vue -->
    <template>
      <div>
        <button @click="handleClick"><slot></slot></button>
      </div>
    </template>
    
    <script>
    export default {
      name: 'wangButton',
      methods: {
        handleClick (evt) {
          this.$emit('click', evt)
          evt.preventDefault()
        }
      }
    }
    </script>
    <style></style>
    
  • 創(chuàng)建Form-test.vue測試組件

    <template>
      <wang-form class="form" ref="form" :model="user" :rules="rules">
        <wang-form-item label="用戶名" prop="username">
          <!-- <wang-input v-model="user.username"></wang-input> -->
          <wang-input :value="user.username" @input="user.username=$event" placeholder="請輸入用戶名"></wang-input>
        </wang-form-item>
        <wang-form-item label="密碼" prop="password">
          <wang-input type="password" v-model="user.password"></wang-input>
        </wang-form-item>
        <wang-form-item>
          <wang-button type="primary" @click="login">登 錄</wang-button>
        </wang-form-item>
      </wang-form>
    </template>
    
    <script>
    import WangForm from './form/Form'
    import WangFormItem from './form/FormItem'
    import WangInput from './form/Input'
    import WangButton from './form/Button'
    export default {
      components: {
        WangForm,
        WangFormItem,
        WangInput,
        WangButton
      },
      data () {
        return {
          user: {
            username: '',
            password: ''
          },
          rules: {
            username: [
              {
                required: true,
                message: '請輸入用戶名'
              }
            ],
            password: [
              {
                required: true,
                message: '請輸入密碼'
              },
              {
                min: 6,
                max: 12,
                message: '請輸入6-12位密碼'
              }
            ]
          }
        }
      },
      methods: {
        login () {
          console.log('button')
          // this.$refs.form.validate(valid => {
          //   if (valid) {
          //     alert('驗(yàn)證成功')
          //   } else {
          //     alert('驗(yàn)證失敗')
          //     return false
          //   }
          // })
        }
      }
    }
    </script>
    
    <style>
      .form {
        width: 30%;
        margin: 150px auto;
      }
    </style>
    
    

    vue serve ./src/Form-test.vue運(yùn)行

  • 設(shè)置表單驗(yàn)證

    表單驗(yàn)證原則:input組件中觸發(fā)自定義事件validate怠硼、FormItem渲染完畢注冊自定義事件validate

    修改Input.vue

    ...
    <script>
    export default {
      ...
      methods: {
        // input組件中觸發(fā)自定義事件validate
        // FormItem渲染完畢注冊自定義事件validate
        handleInput (evt) {
          this.$emit('input', evt.target.value)
          // 找input的父組件
          const findParent = parent => {
            while (parent) {
              if (parent.$options.name === 'LgFormItem') {
                break
              } else {
                parent = parent.$parent
              }
            }
            return parent
          }
          const parent = findParent(this.$parent)
          // 如果找到就觸發(fā)自定義事件
          if (parent) {
            parent.$emit('validate')
          }
        }
      }
    }
    </script>
    

    需要在Fome.vue中將Form組件實(shí)例注冊依賴

    provide () {
        return {
          form: this
        }
      }
    

    修改FormItem.vue鬼贱,使用async-validator進(jìn)行驗(yàn)證

    ...
    <script>
    import AsyncValidator from 'async-validator'
    export default {
      name: 'WangFormItem',
      inject: ['form'],
      ...
      mounted () {
        this.$on('validate', () => {
          this.validate()
        })
      },
      methods: {
        validate () {
          // 如果沒有prop 就不需要驗(yàn)證
          if (!this.prop) return
          const value = this.form.model[this.prop]
          const rules = this.form.rules[this.prop]
    
          const descriptor = { [this.prop]: rules }
          const validator = new AsyncValidator(descriptor)
          return validator.validate({ [this.prop]: value }, errors => {
            if (errors) {
              this.errMessage = errors[0].message
            } else {
              this.errMessage = ''
            }
          })
        }
      }
    }
    </script>
    
    <style>
    </style>
    
    

    修改Form.vue,提供validate方法

    methods: {
        validate (cb) {
          // 過濾出含有prop驗(yàn)證的節(jié)點(diǎn) 執(zhí)行validate方法 返回promise對象
          const tasks = this.$children
            .filter(child => child.prop)
            .map(child => child.validate())
    
          Promise.all(tasks)
            .then(() => cb(true))
            .catch(() => cb(false))
        }
    }
    
  • 此時(shí)重新運(yùn)行香璃,開啟表單驗(yàn)證
    項(xiàng)目地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吩愧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子增显,更是在濱河造成了極大的恐慌,老刑警劉巖脐帝,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件同云,死亡現(xiàn)場離奇詭異,居然都是意外死亡堵腹,警方通過查閱死者的電腦和手機(jī)炸站,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疚顷,“玉大人旱易,你說我怎么就攤上這事禁偎。” “怎么了阀坏?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵如暖,是天一觀的道長。 經(jīng)常有香客問我忌堂,道長盒至,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任士修,我火速辦了婚禮枷遂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棋嘲。我一直安慰自己酒唉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布沸移。 她就那樣靜靜地躺著痪伦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阔籽。 梳的紋絲不亂的頭發(fā)上流妻,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機(jī)與錄音笆制,去河邊找鬼绅这。 笑死,一個(gè)胖子當(dāng)著我的面吹牛在辆,可吹牛的內(nèi)容都是我干的证薇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼匆篓,長吁一口氣:“原來是場噩夢啊……” “哼浑度!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鸦概,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤箩张,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后窗市,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體先慷,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年咨察,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了论熙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摄狱,死狀恐怖脓诡,靈堂內(nèi)的尸體忽然破棺而出无午,到底是詐尸還是另有隱情,我是刑警寧澤祝谚,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布宪迟,位于F島的核電站,受9級特大地震影響踊跟,放射性物質(zhì)發(fā)生泄漏踩验。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一商玫、第九天 我趴在偏房一處隱蔽的房頂上張望箕憾。 院中可真熱鬧,春花似錦拳昌、人聲如沸袭异。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽御铃。三九已至,卻和暖如春沈矿,著一層夾襖步出監(jiān)牢的瞬間上真,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工羹膳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留睡互,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓陵像,卻偏偏與公主長得像就珠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子醒颖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

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

  • 鏈接:本日資料 https://pan.baidu.com/s/1QMuaC6j0MsNA3DnE1i9tIA&s...
    lww文閱讀 487評論 0 0
  • [#](#后臺手冊) 后臺手冊 =============== [#](#分頁實(shí)現(xiàn)) 分頁實(shí)現(xiàn) ---------...
    湯姆開源閱讀 15,041評論 0 0
  • 前言 在工作中經(jīng)常會用到Vue妻怎,包括也會用到很多重要的點(diǎn)例如組件化等等,現(xiàn)在也想對于之前的應(yīng)用和學(xué)習(xí)做一個(gè)小小的總...
    羊駝駝駝駝閱讀 442評論 0 2
  • 1 頁面發(fā)布 1.1 技術(shù)方案 技術(shù)方案說明: 1泞歉、平臺包括多個(gè)站點(diǎn)逼侦,頁面歸屬不同的站點(diǎn)。 2腰耙、發(fā)布一個(gè)頁面應(yīng)將該...
    lww文閱讀 442評論 0 0
  • 原文地址:https://www.jb51.net/article/175603.htm 這篇文章主要為大家詳細(xì)介...
    zZ_d205閱讀 746評論 0 0