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

简介: 前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。前面我们基本学会了 Vue 的基本使用,那么今天我们来尝试实现一个库存管理系统,因为没有学服务端(放后面 express 里面做接口),我们暂时就不考虑服务端的实现了,直接存本地。demo地址:https://www.lilnong.top/static/html/vue-erp-test.html。demo地址,修改为 vue@2.6.11,支持新

需求


  1. 部门管理


bVbO6tV.webp.jpg


  1. 人员管理,人员需要和部门关联。


bVbO6tU.webp.jpg


  1. 库存管理,需要关联人员


bVbO6tL.webp.jpg


  1. 可以补货
  2. 可以被领用,需要有领用人和数量


4.需要有操作记录


bVbO6t8.webp.jpg


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


  • 因为没有服务端,所以数据存放在 localStroage 中。
  • 基本上就是 table + dialog
  • table 负责展示数据
  • dialog 负责新增修改数据
  • 初始化从 localStroage 读取数据,每次操作完保存 localStroage。


实现



table 列表


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


  • v-if 用来判断当前应该显示那个标签的内容


  • v-bind,缩写为:
  • size="mini" 用来传入了一个字符串,其实等价于 :size="'mini'"


  • v-on,缩写为@
  • @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;
},


相关文章
|
9天前
|
存储 前端开发 JavaScript
前端状态管理:Vuex 核心概念与实战
Vuex 是 Vue.js 应用程序的状态管理模式和库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。本教程将深入讲解 Vuex 的核心概念,如 State、Getter、Mutation 和 Action,并通过实战案例帮助开发者掌握在项目中有效使用 Vuex 的技巧。
|
23天前
|
Web App开发 缓存 监控
前端性能优化实战:从代码到部署的全面策略
前端性能优化实战:从代码到部署的全面策略
21 1
|
23天前
|
Web App开发 前端开发 JavaScript
前端性能优化实战:从代码到部署的全面指南
前端性能优化实战:从代码到部署的全面指南
24 1
|
28天前
|
缓存 前端开发 搜索推荐
前端性能优化实战:提升网页加载速度
前端性能优化实战:提升网页加载速度
|
1月前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
56 2
|
1月前
|
前端开发 JavaScript 数据可视化
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
34 2
|
1月前
|
前端开发 JavaScript 开发者
React与Vue:前端框架的巅峰对决与选择策略
【10月更文挑战第23天】React与Vue:前端框架的巅峰对决与选择策略
|
1月前
|
前端开发 JavaScript 数据管理
React与Vue:两大前端框架的较量与选择策略
【10月更文挑战第23天】React与Vue:两大前端框架的较量与选择策略
|
19天前
|
JavaScript 前端开发 搜索推荐
Vue的数据驱动视图与其他前端框架的数据驱动方式有何不同?
总的来说,Vue 的数据驱动视图在诸多方面展现出独特的优势,其与其他前端框架的数据驱动方式的不同之处主要体现在绑定方式、性能表现、触发机制、组件化结合、灵活性、语法表达以及与后端数据交互等方面。这些差异使得 Vue 在前端开发领域具有独特的地位和价值。
|
2月前
|
人工智能 资源调度 数据可视化
【AI应用落地实战】智能文档处理本地部署——可视化文档解析前端TextIn ParseX实践
2024长沙·中国1024程序员节以“智能应用新生态”为主题,吸引了众多技术大咖。合合信息展示了“智能文档处理百宝箱”的三大工具:可视化文档解析前端TextIn ParseX、向量化acge-embedding模型和文档解析测评工具markdown_tester,助力智能文档处理与知识管理。