前端最基礎的就是 HTML+CSS+Javascript
。掌握了這三門技術就算入門,但也僅僅是入門,如今前端開發的定義已經遠遠不止這些。前端小課堂(HTML/CSS/JS
),本着提高技術水平,打牢基礎知識的中心思想,咱們開課啦(每週四)。html
前面咱們基本學會了 Vue 的基本使用,那麼今天咱們來嘗試實現一個庫存管理系統,由於沒有學服務端(放後面 express 裏面作接口),咱們暫時就不考慮服務端的實現了,直接存本地。前端
demo地址:https://www.lilnong.top/static/html/vue-erp-test.html。
demo地址,修改成 vue@2.6.11,支持新的插槽語法:https://www.lilnong.top/static/html/vue-erp-test-vue@2.6.11.htmlvue
庫存管理,須要關聯人員
面試
需求大概就是這樣,下面說一下咱們的實現方案:express
基本上就是 table + dialogsegmentfault
代碼以下,咱們來看一下里面都用到了那些東西微信
v-if 用來判斷當前應該顯示那個標籤的內容函數
v-bind,縮寫爲 :
this
size="mini"
用來傳入了一個字符串,其實等價於 :size="'mini'"
v-on,縮寫爲 @
spa
@click="insertGroup"
用來實現單擊時觸發函數。插槽,用於父組件給子組件傳遞 DOM
<el-button>新增部門</el-button>
,el-button
是一個組件,內部接收到了一個 <slot name="default">
的內容。<template slot-scope="scope">
這裏是一個做用域插槽,DOM 使用父級的,可是做用域使用子級的。固然 slot-scope
被廢棄了,應該用 2.6.0 增長的 v-slot
<div v-if="navIdx == 1"> <div class="header">部門管理</div> <div class="search-box"> <el-button size="mini" type="primary" @click="insertGroup">新增部門</el-button> </div> <el-table :data="list1" style="width: 100%;padding-left: 10px;"> <el-table-column prop="id" label="編號" width="180"> </el-table-column> <el-table-column prop="name" label="名稱" width="auto"> </el-table-column> <el-table-column label="操做" width="200"> <template slot-scope="scope"> <el-button size="mini" type="warning" @click="updateGroup(scope.row)">修改部門信息</el-button> </template> </el-table-column> </el-table> </div>
代碼以下,咱們來看一下里面都用到了那些東西
dialog
的狀態,所有集成到一個 memberInfo
變量中。.sync
(vue 2.3.0+ 新增) 能夠理解是對組件間數據雙向綁定的一個擴展。以前只能用 v-model
來作(:value
和 @input
)。
:visible.sync="memberInfo.dialogVisible"
子組件能夠經過 this.$emit('update:visible', newVisible)
來修改父組件的 memberInfo.dialogVisible
的值。插槽
<span slot="footer" class="dialog-footer">
,固然 slot
被廢棄了,應該用 2.6.0 增長的 v-slot
<el-dialog :title="memberInfo.id?'修改':'新增'" :visible.sync="memberInfo.dialogVisible" width="30%"> <div> <div> <el-input v-model="memberInfo.name" placeholder="人員名稱"></el-input> </div> <div> <el-select v-model="memberInfo.groupid" placeholder="請選擇所屬部門"> <el-option v-for="item in list1" :key="item.id" :label="item.name" :value="item.id"> </el-option> </el-select> </div> </div> <span slot="footer" class="dialog-footer"> <el-button size="mini" @click="memberInfoHandler(0)">取 消</el-button> <el-button size="mini" type="primary" @click="memberInfoHandler(1)">確 定</el-button> </span> </el-dialog>
created
時從 localStorage
讀取數據。由於 Storage 只能保存字符串,因此還須要 JSON.parse
一下。
created(){ this.list1 = JSON.parse(localStorage.getItem('list1')) || [] this.list2 = JSON.parse(localStorage.getItem('list2')) || [] this.list3 = JSON.parse(localStorage.getItem('list3')) || [] this.list4 = JSON.parse(localStorage.getItem('list4')) || [] },
groupInfoHandler(type){ // 0取消 1確認 console.log('groupInfoHandler', arguments) if(!type){ }else{ if(this.groupInfo.id){ var item = this.groupHash[this.groupInfo.id]; this.saveLog(2, `更新部門:${item.name} => ${this.groupInfo.name}`) item.name = this.groupInfo.name }else{ if(this.groupInfo.name.trim().length == ''){ return this.$message.error("請輸入名稱") } this.list1.push({ id: (this.list1.length+1), name: this.groupInfo.name }) this.saveLog(2, `新增部門:${this.groupInfo.name}`) } localStorage.setItem('list1',JSON.stringify(this.list1)) } this.groupInfo.dialogVisible = false; },