前端培训-中级阶段(43)- vue 2.x 实战 CURD

前端最基础的就是 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

需求

  1. 部门管理
    image.png
  2. 人员管理,人员须要和部门关联。
    image.png
  3. 库存管理,须要关联人员
    image.png面试

    1. 能够补货
    2. 能够被领用,须要有领用人和数量
  4. 须要有操做记录
    image.png

需求大概就是这样,下面说一下咱们的实现方案:express

  • 由于没有服务端,因此数据存放在 localStroage 中。
  • 基本上就是 table + dialogsegmentfault

    • table 负责展现数据
    • dialog 负责新增修改数据
  • 初始化从 localStroage 读取数据,每次操做完保存 localStroage。

实现

table 列表

代码以下,咱们来看一下里面都用到了那些东西微信

  • 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

代码以下,咱们来看一下里面都用到了那些东西

  • 首先咱们把一个 dialog 的状态,所有集成到一个 memberInfo 变量中。
    这样实际上是方便咱们开发的,若是是多个 dialog 的场景,咱们就能够很方便的分辨出做用域。
  • .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;
},

微信公众号:前端linong

clipboard.png

参考文献

  1. 前端培训目录、前端培训规划、前端培训计划
相关文章
相关标签/搜索