博客列表 >JSON的两个API/购物车实战

JSON的两个API/购物车实战

吴长清
吴长清原创
2022年08月01日 09:17:24454浏览

1.JSON的两个API

前后端交互原理:
1.从html页面得到数据
2.将数据转为json字符串JSON.stringify(data),将json字符串发送给后端
3.后端将数据转为后端的对象或数组,处理后保存到数据库
4.得到数据库的数据后,通过后端的函数把数据转为json字符串发送给前端
5.前端收到json字符串,通过JSON.parse(jsonString)把JSON字符串转为js对象
6.转为js对象处理后,可以通过dom树操作挂载给html页面

优点:
1.数据格式简单,易读写,所以它的语法小而轻,数据交互时解析时间快,页面响应时间也更快,占用带宽小
2.兼容性更广泛,目前几乎是互联网上通用的数据交互方式,各大平台和浏览器都支持json传输方式,支持多种语言

  1. // 声明对象
  2. let obj= {
  3. id: 1,
  4. name: "张三",
  5. email: "zhangsan@163.com",
  6. addr: "贵阳观山湖",
  7. };
  8. console.log('js对象: ',obj);
  9. // 1.将js对象序列化 发送到前段
  10. console.log('序列化对象后的json字符串: ', JSON.stringify(obj));
  11. // 2.将序列化js对象的值模拟为后端发送的json字符串
  12. // 后端数据
  13. let phpObj = JSON.stringify(obj);
  14. // 3.将后端数据反序列化
  15. console.log('将后端的json字符串反序列化为js对象: ', JSON.parse(phpObj));

2.实战-购物车

效果图:

代码:

  1. <header>
  2. <span>购物车</span>
  3. </header>
  4. <main>
  5. <div class="goods">
  6. <div class="item">
  7. <input type="checkbox" class="selectOne" onchange="selectOne(this)" id="selectOne" checked />
  8. <img src="static/iamage/1.jpeg" alt="" />
  9. <span class="title">联想ThinkBook Plus 17 双屏轻薄本 英特尔酷睿i7 17.3英寸 i7-12700H 16G 512G</span>
  10. <div class="count">
  11. <input type="number" value="1" min="1" class="num" />
  12. <span class="priceTag">单价: <span class="price">100</span></span>
  13. <span class="amountTag">小计: <span class="amount">0</span></span>
  14. </div>
  15. </div>
  16. </main>
  17. <footer>
  18. <div class="left">
  19. <input type="checkbox" onchange="selectAll(this)" class="selectAll" id="slectAll" checked />
  20. <span>全选</span>
  21. </div>
  22. <span>
  23. 已选<span class="nums">0</span>件,
  24. <span>合计</span>
  25. <span style="color: red"></span>
  26. <span class="totalAmount">0</span>
  27. <span></span>
  28. </span>
  29. <button>领劵结算</button>
  30. </footer>
  1. @import url("reset.css");
  2. body header {
  3. width: 100%;
  4. height: 0.4rem;
  5. background-color: white;
  6. position: fixed;
  7. left: 0;
  8. top: 0;
  9. box-shadow: 0.02rem 0.02rem 0.5rem rgba(0, 0, 0, 0.2);
  10. }
  11. body header span {
  12. display: block;
  13. font-size: larger;
  14. font-weight: bold;
  15. text-align: center;
  16. line-height: 0.4rem;
  17. }
  18. body footer {
  19. width: 100%;
  20. height: 0.8rem;
  21. background-color: white;
  22. position: fixed;
  23. left: 0;
  24. bottom: 0;
  25. display: flex;
  26. place-content: space-between;
  27. padding: 0 0.2rem;
  28. line-height: 0.8rem;
  29. gap: 0 10px;
  30. }
  31. body footer span {
  32. color: #888;
  33. }
  34. body footer span:last-of-type span:nth-of-type(1),
  35. body footer span:last-of-type span:nth-of-type(4) {
  36. font-size: x-large;
  37. color: red;
  38. }
  39. body footer span:last-of-type span:nth-of-type(2),
  40. body footer span:last-of-type span:last-of-type {
  41. color: #000;
  42. }
  43. body footer .left {
  44. margin-top: 0.04rem;
  45. }
  46. body footer button {
  47. width: 1rem;
  48. height: 0.5rem;
  49. margin: auto;
  50. background-color: red;
  51. border: none;
  52. border-radius: 0.3rem;
  53. padding: 0.05rem;
  54. color: white;
  55. font-weight: bold;
  56. }
  57. body main {
  58. margin-top: 0.5rem;
  59. padding: 0 0.15rem;
  60. }
  61. body main .goods {
  62. margin: auto;
  63. display: flex;
  64. flex-wrap: wrap;
  65. gap: 0.2rem 0;
  66. padding-bottom: 1rem;
  67. }
  68. body main .goods .item {
  69. padding: 0 0.1rem;
  70. width: 100%;
  71. height: 1rem;
  72. border-radius: 00.1rem;
  73. background-color: white;
  74. box-shadow: 0.02rem 0.02rem 0.05rem rgba(0, 0, 0, 0.5);
  75. display: grid;
  76. grid-template-columns: 0.2rem 1rem 1fr;
  77. grid-template-rows: 1fr 0.4rem;
  78. gap: 0 0.1rem;
  79. place-items: center;
  80. }
  81. body main .goods .item input[type="checkbox"] {
  82. grid-row: span 2;
  83. }
  84. body main .goods .item img {
  85. width: 0.9rem;
  86. grid-row: span 2;
  87. border-radius: 0.04rem;
  88. }
  89. body main .goods .item .title {
  90. width: 100%;
  91. place-self: center start;
  92. font-size: x-small;
  93. }
  94. body main .goods .item .count {
  95. width: 100%;
  96. display: flex;
  97. place-content: space-between;
  98. }
  99. body main .goods .item .count .price,
  100. body main .goods .item .count .amount {
  101. font-size: large;
  102. color: red;
  103. }
  104. body main .goods .item input[type="number"] {
  105. width: 0.5rem;
  106. border: none;
  107. outline: none;
  108. text-align: center;
  109. /* font-size: 1em; */
  110. background-color: transparent;
  111. }
  1. // 得到所有复选框
  2. let checkItems = document.querySelectorAll(".selectOne");
  3. /* 全选按钮 */
  4. selectAll = (ele) => {
  5. // 得到全选按钮的状态
  6. let status = ele.checked;
  7. // 找到商品列表中所有的复选框,并将全选框的状态赋予列表中的复选框
  8. document.querySelectorAll(".selectOne").forEach((item) => (item.checked = status));
  9. autoCalculate();
  10. };
  11. /* 根据用户的选择来动态的设置"全选"按钮的状态 */
  12. selectOne = (ele) => {
  13. // every()当满足所有条件时才返回ture 且数组的方法 必须转为数组
  14. document.querySelector(".selectAll").checked = [...checkItems].every(
  15. (item) => item.checked === true
  16. );
  17. autoCalculate();
  18. };
  19. // 得到商品的数量元素
  20. const nums = document.querySelectorAll(".goods .item .num");
  21. // 计算商品总数
  22. // reduce(acc,cur):自动计算 累加
  23. getTotalNum = (numsArr) => (numsArr.length === 0 ? 0 : numsArr.reduce((acc, cur) => acc + cur));
  24. //计算每件商品的价格
  25. getOneAmount = (numsArr, priceArr) => {
  26. return numsArr.map((item, index) => item * priceArr[index]);
  27. };
  28. // 计算总金额
  29. getTotalAmount = (amountArr) =>
  30. amountArr.length === 0 ? 0 : amountArr.reduce((acc, cur) => acc + cur);
  31. // 自动计算
  32. autoCalculate = () => {
  33. // 1. 页面初始的小计、总计数量及总价
  34. // 得到所有数量
  35. let numArr = [...checkItems].map((item) =>
  36. parseInt(item.parentElement.children[3].children[0].value)
  37. );
  38. // 得到单价类数组
  39. let prices = document.querySelectorAll(".goods .item .count .price");
  40. // 得多所有商品的价格
  41. let priceArr = [...prices].map((item) => item.textContent);
  42. // 给每件商品做小计 单价*价格
  43. // getOneAmount()得到金额数组
  44. let amountArr = getOneAmount(numArr, priceArr);
  45. // 给每个小计标签遍历赋值 将计算的小计添加到页面
  46. document
  47. .querySelectorAll(".goods .item .count .amount")
  48. .forEach((item, i) => (item.textContent = amountArr[i]));
  49. // 2. checked=ture情况下的小计、总计数量及总价
  50. // 得到只有选中状态的复选框
  51. let newCheckItems = [...checkItems].filter((item) => item.checked === true);
  52. // 只计算check为true的 数量总和
  53. let numArrTure = [...newCheckItems].map((item) =>
  54. parseInt(item.parentElement.children[3].children[0].value)
  55. );
  56. // 将计算的商品总数量添加到页面
  57. document.querySelector("footer .nums").textContent = getTotalNum(numArrTure);
  58. // 填充总金额
  59. // 只计算check为true的 小计金额
  60. let amountArrTure = newCheckItems.map((item) =>
  61. parseInt(item.parentElement.children[3].children[2].children[0].textContent)
  62. );
  63. document.querySelector("footer .totalAmount").textContent = getTotalAmount(amountArrTure);
  64. };
  65. // 页面加载时自动计算购物车的数量、小计、总计
  66. window.onload = autoCalculate;
  67. // 当用户更新商品数量时, 将会触发数量、小计、总计的动态更新
  68. nums.forEach((item) => (item.onchange = autoCalculate));
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议