(五)小案例银行家应用程序-实现转账

server/2024/10/20 7:15:37/

现在我们想实现用户之间相互转账的功能;

在这里插入图片描述

● 和之前一样我们还是要通过这个点击,页面元素一再写在变量里面了
在这里插入图片描述

javascript">btnTransfer.addEventListener('click', function (e) {e.preventDefault();const amount = Number(inputTransferAmount.value);const receiverAcc = accounts.find(acc => acc.username === inputTransferTo.value);console.log(amount, receiverAcc);
});

在这里插入图片描述

● 我们获取到用户输入钱的值和收款方之后,我们还要去判断用户输入值是否大于0,当前转帐房的余额是否大于用户输入值,用户输入的账户名是否存在,等等

javascript">btnTransfer.addEventListener('click', function (e) {e.preventDefault();const amount = Number(inputTransferAmount.value);const receiverAcc = accounts.find(acc => acc.username === inputTransferTo.value);console.log(amount, receiverAcc);if (amount > 0 &&receiverAcc &&currentAccount.balance >= amount &&receiverAcc?.username !== currentAccount.username) {console.log('Transfer valid');}
});

在这里插入图片描述
在这里插入图片描述

注:我们之前的余额代码是这样写的

javascript">const calcDisplayBalance = function (movements) {const balance = movements.reduce((acc, mov) => acc + mov, 0);labelBalance.textContent = `${balance} EUR`;
};

这样的话我们无法访问到余额,因为balance是在calcDisplayBalance函数内部声明的局部变量,它只在函数内部可见,外部无法访问。因此,在btnTransfer的事件监听器中,无法访问到balance,导致条件判断中的currentAccount.balance始终为undefined,从而影响了if条件的判断结果。所以我们要想去知道这个人的余额,但是代码中并没有地方去存储他,所有我们要稍微修改一下这个代码

javascript">const calcDisplayBalance = function (acc) {acc.balance = acc.movements.reduce((acc, mov) => acc + mov, 0);labelBalance.textContent = `${acc.balance}`;
};

修改后的代码balance是赋值给了账户对象(acc)的balance属性,而acc是calcDisplayBalance函数的参数,在函数外部定义的。这样一来,balance变量的作用域就延伸到了函数外部,可以在后续的代码中访问到。因为balance的作用域包含了整个函数外部;这样我们也不需要单独找个地方来存放用户的余额;
这个代码修改之后,在上一节用户登录的时候调用用户的余额,传参数的话只需要穿用户账号就可以了

● 下一步就是将转账人减少金额,收款人增加金额

javascript">if (amount > 0 &&receiverAcc &&currentAccount.balance >= amount &&receiverAcc?.username !== currentAccount.username) {currentAccount.balance.push(-amount);receiverAcc.balance.push(amount);}

然后就是继续更新UI,但是我们不可能复制上述代码,我们还是将更新UI的代码进行重构

javascript">const updateUI = function (acc) {displayMovements(acc.movements);calcDisplayBalance(acc);calcDisplaySummary(acc);
};

● 然后直接调用

javascript">  if (amount > 0 &&receiverAcc &&currentAccount.balance >= amount &&receiverAcc?.username !== currentAccount.username) {currentAccount.movements.push(-amount);receiverAcc.movements.push(amount);updateUI();}

在这里插入图片描述
在这里插入图片描述

● 和之前一样,我们在确认转账之后清空一下用户名和密码的输入

javascript"> inputTransferAmount.value = inputTransferTo.value = '';

在这里插入图片描述

这样我们转账的功能就完成了,一下是实现的全部代码;

javascript">btnTransfer.addEventListener('click', function (e) {e.preventDefault();const amount = Number(inputTransferAmount.value);const receiverAcc = accounts.find(acc => acc.username === inputTransferTo.value);inputTransferAmount.value = inputTransferTo.value = '';if (amount > 0 &&receiverAcc &&currentAccount.balance >= amount &&receiverAcc?.username !== currentAccount.username) {currentAccount.movements.push(-amount);receiverAcc.movements.push(amount);updateUI(currentAccount);}
});

http://www.ppmy.cn/server/6320.html

相关文章

腾讯云免费ssl证书申请与宝塔手动部署

1.在我的证书 - SSL 证书 - 控制台 (tencent.com)页面点击“申请免费证书” 2.在申请页面填写域名、邮箱,对于其中“验证方式”,如果服务器是部署在腾讯云的话,可以选“自动DNS” 3.等待审核通过之后,在我的证书 - SSL 证书 - 控…

Vue.extend()和我的两米大砍刀

Vue.extends是什么&#xff1f; 一个全局API,用于注册并挂载组件。 传统的引用组件的方式是使用import直接引入&#xff0c;但是使用Vue.extends()也可以实现。 使用规则 <div id"mount-point"></div>// 创建构造器 var Profile Vue.extend({templat…

【每日一题】2007. 从双倍数组中还原原数组-2024.4.18

题目&#xff1a; 2007. 从双倍数组中还原原数组 一个整数数组 original 可以转变成一个 双倍 数组 changed &#xff0c;转变方式为将 original 中每个元素 值乘以 2 加入数组中&#xff0c;然后将所有元素 随机打乱 。 给你一个数组 changed &#xff0c;如果 change 是 双…

MySQL内置函数

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;MySQL &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容涉及了MySQL中的内置函数 文章目录 MySQL内置函数1.日期…

【Linux】centos 7 vim默认一个tab键相当于8个空格 -> 修改成4个空格

专栏文章索引&#xff1a;Linux 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、项目场景 二、问题描述 三、原因分析 四、解决方案 1.仅本次 2.永久 一、项目场景 使用vim编辑器编写python3代码 二、问题描述 在使用vim编辑器时&#xff0c;想要缩进&am…

R中list与dataframe相互转换

在用R语言处理数据的过程中&#xff0c;我经常会遇到list和dataframe数据格式之间的转换&#xff0c;一般是需要把list转换为dataframe的情况居多。一直以来我也没有好好研究两者的转换关系&#xff0c;通常都是碰到一次花时间解决一次&#xff0c;不知道有没有和我一样的小伙伴…

C++初级----list(STL)

1、 list介绍 1.1、 list介绍 1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 1. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一…

【uniapp】uniapp返回上一页,并实现刷新界面数据

在uniapp中&#xff0c;经常会有返回上一页的情况&#xff0c;官方提供有 uni.navigateBack 这个api来实现效果&#xff0c;但是此方法返回到上一页之后页面并不会自动刷新&#xff08;不会触发上一页的onLoad()方法&#xff09;。 使用场景 从一个列表界面点击新增按钮&…