Vue2.x案例之商品增删改查的实现

简介: 准备环境; vue-cli方式开发; 校验效果; 传统开发

0x01 准备环境

1. 安装nvm(node与npm)

a. 按流程下载相对于版本的node即可,也会默认安装好对应版本的npm

2. 安装并初始化vue-cli

a. 请参考教程:Vue2.x最简单的两个入门例子


0x02 vue-cli方式开发

1. 启动项目

a. 进入到vue_sny目录下(可以自行创建新项目),执行:

npm run dev

b. 打开端口,可看到相关信息:

localhost:8880

2019013120572525.png

a. 修改vue_sny/src/App.vue文件的内容为:

<template>
  <div id="app">
    <table id="productListTable">
      <thead>
        <tr>
          <th>商品名称</th>
          <th>数量</th>
          <th>操作</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="product in products ">
          <td>{{product.productName}}</td>
          <td>{{product.nums}}</td>
          <td>
            <a href="#nowhere" @click="edit(product)">编辑</a>
            <a href="#nowhere" @click="deleteProduct(product.id)">删除</a>
          </td>
        </tr>
        <tr>
          <td colspan="3">      
            商品名称:
            <input type="text" v-model="product4Add.productName" />
            <br> 
            数量:
            <input type="number" v-model="product4Add.nums" />
            <br>
            <button type="button" v-on:click="add">增加</button>
          </td>
        </tr>
      </tbody>
    </table>
    <div id="div4Update" v-show="false">
      商品名称:
      <input type="text" v-model="product4Update.productName" />
      <br> 
      数量:
      <input type="number" v-model="product4Update.nums" />
      <input type="hidden" v-model="product4Update.id" />
      <br>
      <button type="button" v-on:click="update">修改</button>
      <button type="button" v-on:click="cancel">取消</button>
    </div>
  </div>
</template>
<script>
    //Model
    var data = {
        products: [
          { id: 1, productName: '袜子', nums: 15},
          { id: 2, productName: '羊毛衫', nums: 20},
          { id: 3, productName: '雪纺衫', nums: 24},
          { id: 4, productName: '高跟鞋', nums: 30}
        ],
        product4Add: { id: 0, productName: '', nums: '0'},
        product4Update: { id: 0, productName: '', nums: '0'}
    };
    var maxId = 5;
    for (var i=0;i<data.products.length;i++){
        if (data.products[i].id > maxId)
            maxId=  this.products[i].id;
    }
  export default {
    name: 'App',
    data: function() {
      return data;
    },
    methods: {
      add: function (event) {
                maxId++;
                this.product4Add.id = maxId;
                if(this.product4Add.productName.length==0)
                    this.product4Add.productName = "product#"+this.product4Add.id;
                //将对象加入到数组
                this.products.push(this.product4Add);
                this.product4Add = { id: 0, productName: '', nums: '0'}
            },
            deleteProduct: function (id) {
                console.log("id"+id);
                for (var i=0;i<this.products.length;i++){
                    if (this.products[i].id == id) {
                        this.products.splice(i, 1);
                        break;
                    }
                }
            },
            edit: function (product) {
                $("#productListTable").hide();
                $("#div4Update").show();
                this.product4Update = product;
            },
            update:function(){
                $("#productListTable").show();
                $("#div4Update").hide();          
            },
            cancel:function(){
                //恢复显示
                $("#productListTable").show();
                $("#div4Update").hide();
            },
    },
  }
</script>
<style type="text/css">
  td {
    border: 1px solid #000;
  }
</style>

3. 代码讲解

a. App.vue主要分为三部分template、script、style,分别对应着html、js、css:

<template>
</template>
<script>
</script>
<style>
</style>

b. 一般情况下用了vue,不再使用jQuery,此处为了对比学习,特地加入了jQuery,此外:#div4Update初还加入了v-show=“false”,来进行初始化,隐藏编辑框。

c. methods记得加上s。


0x03 校验效果

1. 详细步骤

a. 刷新localhost:8880界面,可看到内容:

20190211161331934.png

b. 然后自行进行增删改查操作进行校验,发现添加与删除都成功,但编辑无法成功。

2. 引入jQuery

a. 在浏览器按F12,点console:

Uncaught ReferenceError: $ is not defined

原因:$无法使用

解决:引入jQuery

b. 安装jQuery

ctrl+c停止之前的命令行窗口,执行

npm install --save jquery

出现警告,不管就行:

$ npm install --save jquery
npm WARN ajv-keywords@2.1.1 requires a peer of ajv@^5.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.7 (node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.7: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})
+ jquery@3.3.1
added 1 package from 1 contributor and audited 30845 packages in 38.583s
found 8 vulnerabilities (1 low, 1 moderate, 5 high, 1 critical)
  run `npm audit fix` to fix them, or `npm audit` for details

c. 修改webpack配置文件(项目/build/webpack.base.conf.js)

在开头引入webpack,因为该文件默认没有引用:

const webpack = require('webpack')


20190211163010936.png

引入插件:

// 添加代码
plugins: [
  new webpack.ProvidePlugin({
    $: "jquery",
    jQuery: "jquery",
    jquery: "jquery",
    "window.jQuery": "jquery"
  })
],

20190211163350463.png

d. 在main.js引入jQuery:

import $ from 'jquery'

e. 然后启动项目:

npm run dev

f. 重新校验,发现成功了!

0x04 传统开发

1. 非vue-cli方式代码

<html>
<head>
  <meta charset="utf-8"/>
    <script src="https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/vue/2.5.22/vue.min.js"></script>
    <style type="text/css">
        td{
            border:1px solid #000;
        }     
    </style>
</head>
<body>
  <div id="app">
    <table id="productListTable">
      <thead>
        <tr>
          <th>商品名称</th>
          <th>数量</th>
          <th>操作</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="product in products">
          <td>{{product.productName}}</td>
          <td>{{product.nums}}</td>
          <td>
            <a href="#nowhere" @click="edit(product)">编辑</a>
            <a href="#nowhere" @click="deleteProduct(product.id)">删除</a>
          </td>
        </tr>
        <tr>
          <td colspan="3">      
            商品名称:
            <input type="text" v-model="product4Add.productName" />
            <br> 
            数量:
            <input type="number" v-model="product4Add.nums" />
            <br>
            <button type="button" v-on:click="add">增加</button>
          </td>
        </tr>
      </tbody>
    </table>
    <div id="div4Update">
      商品名称:
      <input type="text" v-model="product4Update.productName" />
      <br> 
      数量:
      <input type="number" v-model="product4Update.nums" />
      <input type="hidden" v-model="product4Update.id" />
      <br>
      <button type="button" v-on:click="update">修改</button>
      <button type="button" v-on:click="cancel">取消</button>
    </div>
  </div>
    <script type="text/javascript">
        $("#div4Update").hide();
        //Model
        var data = {
            products: [
            { id: 1, productName: '袜子', nums: 15},
            { id: 2, productName: '羊毛衫', nums: 20},
            { id: 3, productName: '雪纺衫', nums: 24},
            { id: 4, productName: '高跟鞋', nums: 30}
            ],
            product4Add: { id: 0, productName: '', nums: '0'},
            product4Update: { id: 0, productName: '', nums: '0'}
        };
        var maxId = 5;
        for (var i=0;i<data.products.length;i++){
            if (data.products[i].id > maxId)
                maxId=  this.products[i].id;
        }      
    //ViewModel
    var vue = new Vue({
        el: '#app',
        data: data,
        methods: {
            add: function (event) {
                maxId++;
                this.product4Add.id = maxId;
                if(this.product4Add.productName.length==0)
                    this.product4Add.productName = "product-"+this.product4Add.id;
                //将对象加入到数组
                this.products.push(this.product4Add);
                this.product4Add = { id: 0, productName: '', nums: '0'}
            },
            deleteProduct: function (id) {
                console.log("id"+id);
                for (var i=0;i<this.products.length;i++){
                    if (this.products[i].id == id) {
                        this.products.splice(i, 1);
                        break;
                    }
                }
            },
            edit: function (product) {
                $("#productListTable").hide();
                $("#div4Update").show();
                this.product4Update = product;
            },
            update:function(){
                $("#productListTable").show();
                $("#div4Update").hide();          
            },
            cancel:function(){
                //恢复显示
                $("#productListTable").show();
                $("#div4Update").hide();
            }
        }
    });
    </script>
</body>
</html>

2. 两种方式的比较

a. $("#div4Update").hide();对应着<div id="div4Update"v-show="false"

b. 传统方式使用cdn方式引入了vue与jquery,方便很多


0xFF 总结


  1. 本教程实现了一个简单的增删改查小案例,实现前后端分离开发可视化(进阶篇),请读者思考如何通过vue直接获取后台的数据。
  2. 本教程仍然使用了两种方式来实现一个案例,读者们请对比学习,关于webpack的相关知识请自行搜寻资料学习,此处没计划出教程。


相关文章
|
4天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
14天前
|
SQL 数据库
GBase8a 数据库集群v953扩容案例问题分享
GBase8a 数据库集群v953扩容案例问题分享
|
14天前
|
SQL 数据库
gbase 8a 数据库 SQL优化案例-关联顺序优化
gbase 8a 数据库 SQL优化案例-关联顺序优化
|
15天前
|
存储 SQL 数据库
Sybase数据恢复—Sybase数据库常见问题之数据库无法启动的恢复案例
Sybase数据库数据恢复环境: Sybase数据库版本:SQL Anywhere 8.0。 Sybase数据库故障&分析: Sybase数据库无法启动。 使用Sybase Central连接报错。 数据库数据恢复工程师经过检测,发现Sybase数据库出现故障的原因是:异常断电造成Sybase数据库无法回写正常数据,导致多个存储页数据不一致,系统表描述和存储表不一致,部分存储页底层数据完全杂乱。
|
16天前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。
|
22天前
|
存储 Oracle 关系型数据库
oracle数据恢复—Oracle数据库文件大小变为0kb的数据恢复案例
存储掉盘超过上限,lun无法识别。管理员重组存储的位图信息并导出lun,发现linux操作系统上部署的oracle数据库中有上百个数据文件的大小变为0kb。数据库的大小缩水了80%以上。 取出&并分析oracle数据库的控制文件。重组存储位图信息,重新导出控制文件中记录的数据文件,发现这些文件的大小依然为0kb。
|
9天前
|
存储 Oracle 关系型数据库
服务器数据恢复—华为S5300存储Oracle数据库恢复案例
服务器存储数据恢复环境: 华为S5300存储中有12块FC硬盘,其中11块硬盘作为数据盘组建了一组RAID5阵列,剩下的1块硬盘作为热备盘使用。基于RAID的LUN分配给linux操作系统使用,存放的数据主要是Oracle数据库。 服务器存储故障: RAID5阵列中1块硬盘出现故障离线,热备盘自动激活开始同步数据,在同步数据的过程中又一块硬盘离线,RAID5阵列瘫痪,上层LUN无法使用。
|
1月前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
58 2
|
2月前
|
存储 数据挖掘 数据库
数据库数据恢复—SQLserver数据库ndf文件大小变为0KB的数据恢复案例
一个运行在存储上的SQLServer数据库,有1000多个文件,大小几十TB。数据库每10天生成一个NDF文件,每个NDF几百GB大小。数据库包含两个LDF文件。 存储损坏,数据库不可用。管理员试图恢复数据库,发现有数个ndf文件大小变为0KB。 虽然NDF文件大小变为0KB,但是NDF文件在磁盘上还可能存在。可以尝试通过扫描&拼接数据库碎片来恢复NDF文件,然后修复数据库。
|
2月前
|
关系型数据库 MySQL 数据库
一个 MySQL 数据库死锁的案例和解决方案
本文介绍了一个 MySQL 数据库死锁的案例和解决方案。
118 3

热门文章

最新文章