计算属性、方法、过滤器的综合实训-邮购商品业务

【实训要求】

(1)学会定义Vue实例对象,会配置el和data、methods、computed等选项。

(2)学会引入Vue.js, 并完成Vue视图中表单的定义。

(3)学会使用V-model、v-on、v-for等指令完成表单绑定、事件绑定、遍历商品。

(4)学会使用CSS定义<table>、<tr>、<fieldset>、<input>等标记的样式。

(5) 学会定文filters和methods属性。

【设计要求】

(1)按图1所示页面完成邮购商品业务初始化界面设计。分别为“客户姓名”、“单价”、“数量”、“购买价”“、“总价”文本框绑定变量name、price、count、 total、sum, 其中“购买价”和“总价”两个文本框设置为只读。添加两个普通按钮,分别为“记入流水”“、“重置”,绑定单击事件,分别调用add()和clear()方法。

图1  邮购商品业务初始页面

(2)当用户完整输入客户姓名、单价和数量后,自动计算购买价、运费和总价,并填充在相应的文本框中。运费收取规则为:客户购买价大于100 元时免收运费,否则收10元运费。然后单击“记入流水”按钮,将购买相关数据写入当日流水账中。

(3)当单击“重置"按钮时,将“客户姓名”、“单价”和“数量”文本框清空, “购买价”和“总价”文本框自动清空。当用户未输入姓名时,单击“记入流水”按钮会提示告警信息。

(4)定义add()、clear()方法。

add() 方法的功能是将商品购买信息添加到business数组中,并从数组的末尾插入。其中business数组的属性分别为 dateTime (业务时间)、name(客户姓名)、totalAll(购买价)、freight (运费)、sumToal (总价)。clear()方法的功能是分别清除“客户姓名” 、“单价”和“数量”文本框中的内容。

【实训步骤】

(1)建立HTML文件。将项目文件命名为vue-ex-2-2.html。正确引入Vue.js文件,完成“邮购商品业务” 表单内容的设计,使用v-model和v-on指令为表单元素绑定表单和事件。通过<table>标记展示销售流水账,在<tr>标记上使用v-for指令遍历所有销售记来。

(2)定义Vue实例,分别完成el、data、methods 和watch等选项的配置。

定义el,挂载元素为#vue-ex-22。

定义data,分别定义name、price、count、total、sum和保存销售流水帐的数组变量business等初始值(为空)。

定义methods选项。按照设计要求(4) 定义add()和clear()方法。

●定义computed选项。购买价=单价X数量,计算结果保留两位小数。总价=购买价+运费,计算结果保留两位小数。

定义全局过滤器dateFormat,使用Vue.filter('dateFormat’,function(date)){…},功能为完成当前系统日期的格式化处理,输出结果形式为“2019-9-21 16:23:38:641"。

(3)定义相关样式。

●<table>标记样式: 宽度626px,边框宽度1px,单线边框,边框颜色#008000,表格内容居中对齐,边界(上下为0、左右自动)。

. <input>标记样式: 宽度150px,高度25px圆角边框(半径4px)。

●<tr>标记样式: 高度30px。

●<fieldset>标记样式:边界(上下为0、左右自动),填充10px. 宽度600px,边框(1px、双线、颜色#008000) 。

【代码实现】

<!-- vue-ex-2-2.html -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>邮购商品业务</title>
    <!-- 1.引入vue.js -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" type="text/javascript"></script>
    <style type="text/css">
        table {
            border: 1px;
            border-collapse: collapse;
            border-color: #008000;
            width: 626px;
            text-align: center;
            margin: 0 auto;
        }
 
        input {
            width: 150px;
            height: 25px;
            border-radius: 4px;
        }
 
        tr {
            height: 30px;
        }
 
        fieldset {
            margin: 0 auto;
            padding: 10px;
            width: 600px;
            border: 1px double #008000;
        }
    </style>
</head>
<body>
<div id="vue-e-22">
    <div>
        <form>
            <fieldset id="">
                <legend align="center">邮购商品业务</legend>
                <!--//TODO: 完成表单数据绑定 理解v-model双向绑定的特点 -->
                客户姓名:<input type="text" v-model="name" key="name"/>
                单价:<input v-model='price' type="text" key="price"/><br>
                数量:<input v-model="count" type="text" key="count"/>
                购买价:<input type="text" v-model="total" key="total" readonly><br>
				运费:{{ freight }}
                总价:<input type="text" readonly v-model="sum" key="sum"><br>
                注:购买价>=100元免运费<br>
                <!-- //TODO: 完成click事件绑定 -->
                <input type="button" @click="add" value="记入流水">
                <input type="button" @click="clear" value="重置"/>
            </fieldset>
        </form>
    </div>
 
    <table border="1">
        <caption>销售流水帐</caption>
        <thead>
        <tr>
            <th>业务时间</th>
            <th>客户姓名</th>
            <th>购买价</th>
            <th>运费</th>
            <th>总金额</th>
        </thead>
        </tr>
        <tbody>
        <tr v-for="(item,index) in business">
            <!--使用了日期过滤器 -->
            <td>{{item.dateTime|dateFormat}}</td>
            <td>{{item.name}}</td>
            <td>{{item.totalAll}}</td>
            <td>{{item.freight}}</td>
            <td>{{item.sumTotal}}</td>
        </tr>
        </tbody>
    </table>
</div>
<script type="text/javascript">
    // 定义了日期过滤器,格式化日期
	Vue.filter('dateFormat', function(date) {
		let dy = date.getFullYear();
		let dm = date.getMonth()+1<10?"0" + (date.getMonth() + 1) : date.getMonth() + 1;  //解决个位数前置0的问题,下同
		let dd = date.getDate();
		let dhs = date.getHours()<10?"0" + date.getHours() : date.getHours() ;
		let dms = date.getMinutes()<10?"0" + date.getMinutes() : date.getMinutes();
		let dss = date.getSeconds()<10?"0" + date.getSeconds() : date.getSeconds();
 
		return `${dy}年${dm}月${dd}日  ${dhs}:${dms}:${dss}`
	});
    var vm = new Vue({
        el: '#vue-e-22',
        data: {
            dateTime: '',
            name: '',
            price: '',
            count: '',
            freight: '',
            totalAll: '',
            sumTotal: '',
            business: [],
        },
        methods: {
            clear: function () {
                // TODO:完成清除输入域
                this.name = '';
                this.price = '';
                this.count = '';
                this.totalAll = '';
                this.sumTotal = '';
                this.dateTime = '';
 
            },
            add: function () {
                // TODO::完成添加流水
                if (!this.name || !this.price || !this.count) {
                    alert('请填写完整信息!');
                    return;
                }
                let date = new Date();
                this.dateTime = date;
                this.business.push({
                    dateTime:this.dateTime,
                    name: this.name,
                    totalAll: this.totalAll,
                    freight: this.freight,
                    sumTotal: this.sumTotal
                });
                this.clear();
            }
        },
        computed: {
            total: function () {
                // TODO::完成计算购买价
				if(this.price==0|this.price===''&this.count==0|this.count==='')
				{
					this.totalAll='';
				}
				else
				{
					this.totalAll=this.price * this.count;
					return this.price * this.count;
				}
            },
            sum: function () {
                // TODO::完成计算包括运费在内的总价,购买价大于100免运费
 
                if (this.totalAll >= 100) {
                    this.freight = 0;
					this.sumTotal=(parseFloat(this.totalAll) + parseFloat(this.freight)).toFixed(2);
					return (parseFloat(this.totalAll) + parseFloat(this.freight)).toFixed(2);
                } else {
                	if(this.totalAll==='')
					{
						this.freight=''
					}
                	else
					{
						this.freight = 10;
						this.sumTotal=(parseFloat(this.totalAll) + parseFloat(this.freight)).toFixed(2);
						return (parseFloat(this.totalAll) + parseFloat(this.freight)).toFixed(2);
					}
                }
 
            }
        }
    })
</script>
</body>
</html>

【效果展示】 

图1 邮购商品业务初始页面

 图2 单击”重置“按钮时页面

 图3 输入业务数据并单击“记入流水”按钮时页面

图4 未输入业务数据直接单击“记入流水”按钮时页面 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值