vue学习笔记(购物车小案例)

用一个简单的购物车demo来回顾一下其中需要注意的细节。

先看一下最终效果

功能:

(1)全选按钮和下面的商品项的选中状态同步,当下面的商品全部选中时,全选勾选,反之,则不勾选。

(2)控制购物车商品数量,最低为1

(3)拥有小计和总计功能。其中,总计为勾选的商品所需要的总金额。

首先,先把静态页面写出来。

<template>
<div>
<h2>购物车</h2>
全选 <input type="checkbox" >
<div v-for="(item,index) in goods" :key="index">
<input type="checkbox" name="" id="" >

--商品名:{{ item.name }}  --价格:{{ item.price }} 
<!-- 后端数据没有item.num,就使用或1的形式给所有商品默认的数量为1,这样就不用一个个在后端数据中加了 -->
--<button type="button" >+</button>{{item.num || 1}}<button  >-</button>
--小计:0
</div>
<div>总计:0</div>
</div>

</template>

上面的代码将静态页面写了出来,目前没有任何功能而。我们一一进行功能的添加。首先,实现简单的数量加减和小计。

思路:

现在存在两种情况,

第一,就是后端返回了商品数量,也就是item.num这个数据后端是直接给你的,然后我们直接进行使用即可。但是,实际的情况是后端返回的数量是这个商品的总库存,作为我们的购物车来说,一般默认的数量是为1的。所以,这里我们使用逻辑运算符的情况考虑了两种情况。

然后就是加一和减一,比较容易的方法就是直接给加和减分别绑定点击事件,分别进行加减,这里需要使用两个方法。这样的方法就不再介绍。不如换一个思路,让两个事件使用同一个事件,这样就少写了一个方法。

就是两者都是加,而减的操作是加-1.这样就可以合并为一个方法。

代码如下

updateNum(actionType,index){
      //初始化num
      this.goods[index].num = this.goods[index].num||1

      //数量操作
      this.goods[index].num+=actionType

    },

解释一下,第一个参数就是传递过来的值,是加1,还是加-1,第二个值就是对应的索引,因为要对对应的商品进行数量加减操作,所以需要对应商品的索引。

首先,在考虑初始化num的时候,也要考虑num不存在的情况,

然后进行对应的数量操作即可。

那么我们的小计也就可以根据商品数量和价格进行计算了,注意:也要考虑数量不存在的情况。

对应的代码为:

<button type="button" @click="updateNum(1,index)">+</button>{{item.num || 1}}
<button   @click="updateNum(-1,index)">-</button>
--小计:{{(item.num ||1) *item.price}}
</div>

然后就是全选,商品单选,和总计的功能了。

首先进行全选实现,就是让全选的状态和商品单选进行同步。

我们首先定义全选的状态,默认是不选中的。( isAllSelected:false,)

 data(){
    return{
      isAllSelected:false,
      goods:[{
        name:"商品1",
        price:"100",
        // num:"1",
      },
      {
        name:"商品2",
        price:"200"
      },
      {
        name:"商品3",
        price:"300"
      }]
    }
  },

然后对应的给他添加change事件(注意,这里是change事件,并不是click)

全选 <input type="checkbox" :checked="isAllSelected" @change="allSelect">

使用动态绑定属性使他与 isAllSelected:的状态同步,然后写allSelect方法

allSelect(){
      this.isAllSelected=!this.isAllSelected
      console.log(this.isAllSelected);

      //同步单选状态
      this.goods.forEach(item=>{
        item.select=this.isAllSelected
      })
    },

这里就是让他的状态和下面的商品列表的选择框进行同步,思路为:就是对下面的商品列表进行遍历,使用forEach方法,并将其状态赋值给每一项商品的选择状态。

然后就是当下面的每一项的商品取消选中时,那个全选的状态要进行改变。

这里用到另一个数组方法every

singleSelect(index){
      //修改当前单选商品状态
      this.goods[index].select=!this.goods[index].select

      //使用every方法循环数组,如果有一个select为false
      //整个结果为false 全部为true 整个结果为true
      //和我们单选联动 全选逻辑一致
      //直接使用返回值 赋给全选状态
      this.isAllSelected=this.goods.every(item=>item.select)
    }

最后就是总计了,这里的总计是将所有选中的商品进行金额的计算。

这里也是用到了两个数组方法,他们分别是filter和every。

<div>总计:{{ goods.filter(item=>item.select).reduce((total,item)=>total+=item.price*(item.num ||1),0) }}</div>

然后解释一下,这里首先使用filter方法将满足选中状态的商品进行过滤,返回的是一个数组,然后再将返回的数组使用累加方法reduce进行金额的计算。

完整代码附上:

<!--
 * @Author: RealRoad1083425287@qq.com
 * @Date: 2024-07-06 16:18:52
 * @LastEditors: Mei
 * @LastEditTime: 2024-07-06 17:03:12
 * @FilePath: \Fighting\new_project_0705\my-vue-app\src\components\shopcar.vue
 * @Description: 
 * 
 * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
-->
<template>
<div>
<h2>购物车</h2>
全选 <input type="checkbox" :checked="isAllSelected" @change="allSelect">
<div v-for="(item,index) in goods" :key="index">
<input type="checkbox" name="" id="" :checked="item.select" @change="singleSelect(index)">

--商品名:{{ item.name }}  --价格:{{ item.price }} 
<!-- 后端数据没有item.num,就使用或1的形式给所有商品默认的数量为1,这样就不用一个个在后端数据中加了 -->
--<button type="button" @click="updateNum(1,index)">+</button>{{item.num || 1}}<button   @click="updateNum(-1,index)">-</button>
--{{(item.num ||1) *item.price}}
</div>
<div>总计:{{ goods.filter(item=>item.select).reduce((total,item)=>total+=item.price*(item.num ||1),0) }}</div>
</div>

</template>

<script>
export default {
  data(){
    return{
      isAllSelected:false,
      goods:[{
        name:"商品1",
        price:"100",
        // num:"1",
      },
      {
        name:"商品2",
        price:"200"
      },
      {
        name:"商品3",
        price:"300"
      }]
    }
  },
  methods:{
    updateNum(actionType,index){
      //初始化num
      this.goods[index].num = this.goods[index].num||1

      //数量操作
      this.goods[index].num+=actionType

    },

    allSelect(){
      this.isAllSelected=!this.isAllSelected
      console.log(this.isAllSelected);

      //同步单选状态
      this.goods.forEach(item=>{
        item.select=this.isAllSelected
      })
    },
    singleSelect(index){
      //修改当前单选商品状态
      this.goods[index].select=!this.goods[index].select

      //使用every方法循环数组,如果有一个select为false
      //整个结果为false 全部为true 整个结果为true
      //和我们单选联动 全选逻辑一致
      //直接使用返回值 赋给全选状态
      this.isAllSelected=this.goods.every(item=>item.select)
    }
  }
}
</script>


<style>

</style>

通过这个案例,主要是复习一下vue的常见指令的使用,主要是数组方法的使用。这里,将使用的四个数组方法进行详细的介绍。

①forEach

forEach 是 JavaScript 中的一个数组方法,它允许你对数组中的每个元素执行一个函数。这个方法接受一个回调函数作为参数,这个回调函数会对数组中的每个元素执行一次。此外,forEach 方法不会返回一个新数组,它仅仅是对原数组的每个元素执行了提供的函数。

forEach 的基本语法如下:


array.forEach(function(currentValue, index, arr), thisArg)
参数说明:

currentValue:数组中正在处理的当前元素。
index(可选):数组中正在处理的当前元素的索引。
arr(可选):forEach() 方法正在操作的数组。
thisArg(可选):执行回调函数时用作 this 的对象。

上面是官方的介绍,但是在实际的使用中,用的最多的还是currentValue,偶尔也会用到index,这里用一个上次的案例进行效果演示。(主要是遍历数组,记住不会返回新数组就行了)

<!--
 * @Author: RealRoad1083425287@qq.com
 * @Date: 2024-07-05 21:28:45
 * @LastEditors: Mei
 * @LastEditTime: 2024-07-06 17:39:19
 * @FilePath: \Fighting\new_project_0705\my-vue-app\src\components\practice5.vue
 * @Description: 
 * 
 * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
-->
<template>

  <div>
    <div id="myList" v-for="(item,index) in arr" :key="index" @click="arrTest">{{ item.name }}

    </div>
  </div>

</template>


<script>
//列表渲染
//为什么循环的时候需要加key
//1.key的作用主要是为了高效的更新虚拟Dom,提高渲染性能
//2.key属性可以避免数据混乱的情况出现
export default{
  data(){
    return{
      arr:[{
        name:"张三"
      },
    {
      name:"李四"
    },
  {
    name:"王五"
  }]
    }
  },
  methods:{
    arrTest(){
      this.arr.forEach((item,index)=>{
        console.log("我是每一项",item);
        console.log("我是每一项的索引",index);
      })
    }
  }
}

</script>

<style scoped>
#myList{
  color: blue;
  background-color: yellow;
  margin-top: 20px;
}
</style>

效果如下:

②every

every 是 JavaScript 中的一个数组方法,用于测试数组的所有元素是否都满足提供的函数中的测试条件。如果所有元素都通过测试,则返回 true;否则,返回 false。这个方法不会改变原数组,而是返回一个布尔值。

every 方法的基本语法如下:

array.every(function(currentValue, index, arr), thisArg)


参数说明:

currentValue:数组中正在处理的当前元素。
index(可选):数组中正在处理的当前元素的索引。
arr(可选):every 方法正在操作的数组。
thisArg(可选):执行回调函数时用作 this 的值。如果省略了 thisArg 参数,或者设为 null 或 undefined,则 this 会被视为全局对象。在严格模式下,如果省略或为 null 或 undefined,则 this 会是 undefined。

还是一个案例来演示:

<!--
 * @Author: RealRoad1083425287@qq.com
 * @Date: 2024-07-05 21:28:45
 * @LastEditors: Mei
 * @LastEditTime: 2024-07-06 17:53:54
 * @FilePath: \Fighting\new_project_0705\my-vue-app\src\components\practice5.vue
 * @Description: 
 * 
 * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
-->
<template>

  <div>
    <div id="myList" v-for="(item,index) in arr" :key="index" @click="arrTest">{{ item.name }}
      
    </div>
    <div>
      <button @click="arrTest2">点我看every{{ testEvery }}</button>
    </div>
  </div>

</template>


<script>
//列表渲染
//为什么循环的时候需要加key
//1.key的作用主要是为了高效的更新虚拟Dom,提高渲染性能
//2.key属性可以避免数据混乱的情况出现
export default{
  data(){
    return{
      testEvery:"",
      arr:[{
        name:"张三"
      },
    {
      name:"李四"
    },
  {
    name:"王五"
  }],
  arr2:[{
    age:10
  },
  {
    age:20
  },
  {
    age:30
  }]
    }
  },
  methods:{
    arrTest(){
      this.arr.forEach((item,index)=>{
        console.log("我是每一项",item);
        console.log("我是每一项的索引",index);
      })
    },
    arrTest2(){
      this.testEvery=this.arr2.every((item,index)=>{
        return item.age>5
      })
      
    }
  }
}

</script>

<style scoped>
#myList{
  color: blue;
  background-color: yellow;
  margin-top: 20px;
}
</style>

写一个按钮,当我们点击按钮的时候,就可以看到arrTest2返回的值,我们可以看到多了一个true,因为在执行every后,this.testEvery=true,对应页面的testEvery值也会进行显示。

③filter

filter 是 JavaScript 中的一个非常有用的数组方法,它创建一个新的数组,该数组包含通过测试函数的所有元素。换句话说,filter 方法会遍历原数组,对每个元素执行一个测试函数,如果该函数返回 true,则将该元素包含在新数组中。

filter 方法的基本语法如下:
let newArray = array.filter(function(currentValue, index, arr), thisArg)


参数说明:

currentValue:数组中正在处理的当前元素。
index(可选):数组中正在处理的当前元素的索引。
arr(可选):filter 方法正在操作的数组。
thisArg(可选):执行回调函数时用作 this 的值。
filter 方法返回一个新数组,该数组包含原数组中满足测试函数的元素。它不会改变原数组。

上代码

<!--
 * @Author: RealRoad1083425287@qq.com
 * @Date: 2024-07-05 21:28:45
 * @LastEditors: Mei
 * @LastEditTime: 2024-07-06 18:03:11
 * @FilePath: \Fighting\new_project_0705\my-vue-app\src\components\practice5.vue
 * @Description: 
 * 
 * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
-->
<template>

  <div>
    <div id="myList" v-for="(item,index) in arr" :key="index" @click="arrTest">{{ item.name }}
      
    </div>
    <div>
      <button @click="arrTest2">点我看Filter</button>
      <div v-for="(item,index) in testFilter " :key=index>{{ item.age }}</div>
    </div>
  </div>

</template>


<script>
//列表渲染
//为什么循环的时候需要加key
//1.key的作用主要是为了高效的更新虚拟Dom,提高渲染性能
//2.key属性可以避免数据混乱的情况出现
export default{
  data(){
    return{
      testEvery:"",
      testFilter:"",
      arr:[{
        name:"张三"
      },
    {
      name:"李四"
    },
  {
    name:"王五"
  }],
  arr2:[{
    age:10
  },
  {
    age:20
  },
  {
    age:30
  }]
    }
  },
  methods:{
    arrTest(){
      this.arr.forEach((item,index)=>{
        console.log("我是每一项",item);
        console.log("我是每一项的索引",index);
      })
    },
    arrTest2(){
      this.testFilter=this.arr2.filter((item,index)=>{
        return item.age>15
      })
      console.log(this.testFilter);
      
    }
  }
}

</script>

<style scoped>
#myList{
  color: blue;
  background-color: yellow;
  margin-top: 20px;
}
</style>

当我点击按钮后,对应返回的新数组就会被渲染出来。

④reduce

reduce 是 JavaScript 中的一个数组方法,用于将数组中的所有元素通过某个函数(称为“reducer”函数)归并成一个单一的结果。这个方法会遍历数组中的每个元素,并使用 reducer 函数将其累积成一个单一的值。

reduce 方法的基本语法如下:
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)


参数说明:

function(total, currentValue, currentIndex, arr): 这是 reducer 函数,它接受四个参数:
total(必需):初始值,或者计算结束后的返回值(累加器)。
currentValue(必需):当前元素。
currentIndex(可选):当前元素的索引。
arr(可选):当前元素所属的数组对象。
initialValue(可选):传递给函数的初始值。如果没有提供初始值,则将使用数组的第一个元素作为初始值,并从数组的第二个元素开始进行迭代。

上代码:

<!--
 * @Author: RealRoad1083425287@qq.com
 * @Date: 2024-07-05 21:28:45
 * @LastEditors: Mei
 * @LastEditTime: 2024-07-06 18:11:41
 * @FilePath: \Fighting\new_project_0705\my-vue-app\src\components\practice5.vue
 * @Description: 
 * 
 * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
-->
<template>

  <div>
    <div id="myList" v-for="(item,index) in arr" :key="index" @click="arrTest">{{ item.name }}
      
    </div>
    <div>
      <button @click="arrTest2">点我看Filter</button>
      <div v-for="(item,index) in testFilter " :key=index>{{ item.age }}</div>

      <button @click="arrTest3">点我看Reduce</button>
      <!-- <div v-for="(item,index) in testFilter " :key=index>{{ item.age }}</div> -->
    </div>
  </div>

</template>


<script>
//列表渲染
//为什么循环的时候需要加key
//1.key的作用主要是为了高效的更新虚拟Dom,提高渲染性能
//2.key属性可以避免数据混乱的情况出现
export default{
  data(){
    return{
      testEvery:"",
      testFilter:"",
      testReduce:0,
      arr:[{
        name:"张三"
      },
    {
      name:"李四"
    },
  {
    name:"王五"
  }],
  arr2:[{
    age:10
  },
  {
    age:20
  },
  {
    age:30
  }]
    }
  },
  methods:{
    arrTest(){
      this.arr.forEach((item,index)=>{
        console.log("我是每一项",item);
        console.log("我是每一项的索引",index);
      })
    },
    arrTest2(){
      this.testFilter=this.arr2.filter((item,index)=>{
        return item.age>15
      })
      console.log(this.testFilter);
      
    },
    arrTest3(){
      this.testReduce=this.arr2.reduce((total,item)=>{
        return total+item.age
      },0)
      console.log(this.testReduce);
      
    }
  }
}

</script>

<style scoped>
#myList{
  color: blue;
  background-color: yellow;
  margin-top: 20px;
}
</style>

我的年龄数据为10,20,30,他们累加之后为60,如果在最后一项,我不是以0为初始值,更改为1后,累加的值就变成了61. 

 this.testReduce=this.arr2.reduce((total,item)=>{
        return total+item.age
      },0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/780242.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端扫盲:cookie、localStorage和sessionStorage

cookie、localStorage和sessionStorage都是存储数据的方式&#xff0c;他们之间有什么不同&#xff0c;各有什么应用场景&#xff0c;本文为您一一解答。 一、什么是cookie、localStorage和sessionStorage 1. Cookie是一种存储在用户计算机上的小型文本文件&#xff0c;由服务…

和干瘪的列表说拜拜,看看卡片列表的精彩演绎

在移动UI设计中&#xff0c;卡片列表是一种常见的设计模式&#xff0c;可以将干瘪的列表变得更加生动和精彩。卡片列表通过使用卡片元素来呈现列表项&#xff0c;每个卡片可以包含图片、标题、描述、按钮等内容&#xff0c;使得列表项更加丰富和有趣。 以下是一些卡片列表的精彩…

网络防御保护——网络安全概述

一.网络安全概念 1.网络空间---一个由信息基础设施组成相互依赖的网络 。 网络空间&#xff0c;它跟以前我们所理解的网络不一样了&#xff0c;它不光是一个虚无缥缈的&#xff0c;虚拟的东西&#xff0c;它更多的是融入了我们这些真实的物理设备&#xff0c;也就意味着这个网…

数据库作业2

需求 一、在数据库中创建一个表student&#xff0c;用于存储学生信息 CREATE TABLE student( id INT PRIMARY KEY, name VARCHAR(20) NOT NULL, grade FLOAT ); 1、向student表中添加一条新记录 记录中id字段的值为1&#xff0c;name字段的值为"monkey"&#xff0…

1分钟了解LangChain是什么?

一: LangChain介绍 LangChain 是一个基于大型语言模型&#xff08;LLM&#xff09;开发应用程序的框架, 它旨在简化语言模型应用的开发流程&#xff0c;特别是在构建对话系统和其他基于语言的AI解决方案时.目标是将复杂的语言模型技术转化为可通过简单API调用实现的功能&#…

第T4周:使用TensorFlow实现猴痘病识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、前期工作1.设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据 二、数据预处理1、加载数据2、数据可视化3、再…

Splunk Enterprise 中的严重漏洞允许远程执行代码

Splunk 是搜索、监控和分析机器生成大数据的软件领先提供商&#xff0c;为其旗舰产品 Splunk Enterprise 发布了紧急安全更新。 这些更新解决了几个构成重大安全风险的关键漏洞&#xff0c;包括远程代码执行 (RCE) 的可能性。 受影响的版本包括 * 9.0.x、9.1.x 和 9.2.x&…

竞赛 深度学习OCR中文识别 - opencv python

文章目录 0 前言1 课题背景2 实现效果3 文本区域检测网络-CTPN4 文本识别网络-CRNN5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习OCR中文识别系统 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;…

STM32-SPI和W25Q64

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. SPI&#xff08;串行外设接口&#xff09;通信1.1 SPI通信简介1.2 硬件电路1.3 移位示意图1.4 SPI时序基本单元1.5 SPI时序1.5.1 发送指令1.5.2 指定地址写1.5.3 指定地址读 2. W25Q642.1 W25Q64简介2.2 硬件电路2…

【JVM系列】Full GC(完全垃圾回收)的原因及分析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【小沐学Python】在线web数据可视化Python库:Bokeh

文章目录 1、简介2、安装3、测试3.1 创建折线图3.2 添加和自定义渲染器3.3 添加图例、文本和批注3.4 自定义您的绘图3.5 矢量化字形属性3.6 合并绘图3.7 显示和导出3.8 提供和筛选数据3.9 使用小部件3.10 嵌入Bokeh图表到Flask应用程序 结语 1、简介 https://bokeh.org/ https…

从0到1:培训老师预约小程序开发笔记二

背景调研 培训老师预约小程序&#xff1a; 教师和学生可以更便捷地安排课程&#xff0c;并提升教学质量和学习效果&#xff0c;使之成为管理和提升教学效果的强大工具。培训老师可以在小程序上设置自己的可预约时间&#xff0c;学员可以根据老师的日程安排选择合适的时间进行预…

【HICE】dns正向解析

1.编辑仓库 2.挂载 3.下载软件包 4.编辑named.conf 5.编辑named.haha 6.重启服务 7.验证本地域名是否解析

Mysql 数据库主从复制-CSDN

查询两台虚拟机的IP 主虚拟机IP 从虚拟机IP服务 修改对应的配置文件 查询对应配置文件的命令 find / -name my.cnf编辑对应的配置文件 主 my.cnf &#xff08;部分配置&#xff09; [mysqld] ########basic settings######## server_id 1 log_bin /var/log/mysql/mysql-…

leetcode 709. 转换成小写字母

leetcode 709. 转换成小写字母 题解 class Solution { public:string toLowerCase(string s) {string ans;for (int i 0; i < s.size(); i) {if (s[i] > A && s[i] < Z) {s[i] 32;}ans s[i];}return ans;} };

室内定位可视化:精准导航与实时位置展示

通过图扑室内定位可视化技术&#xff0c;提供精准的导航服务和实时位置展示&#xff0c;帮助用户高效找到目标地点&#xff0c;提升空间管理和资源配置的效率与体验。

【昇思25天学习打卡营打卡指南-第十九天】基于MobileNetv2的垃圾分类

CycleGAN图像风格迁移互换 模型介绍 模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;来自论文 Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks 。该模型实现了一种在没有配对示例的情况下学习…

go语言的异常处理机制

error 在go语言中&#xff0c;异常被定义为实现了error接口的类型&#xff0c;error接口只定义了一个返回string类型Error&#xff08;&#xff09;方法&#xff0c;任何实现了Error()方法的类型都可以被定义为异常&#xff0c;以下是一个自定义的异常类型&#xff1a; typ…

【零基础】学JS

喝下这碗鸡汤 “知识就是力量。” - 弗朗西斯培根 1.三元运算符 目标:能利用三元运算符执行满足条件的语句 使用场景:其实是比if双分支更简单的写法&#xff0c;可以使用三元表达式 语法&#xff1a;条件 ? 满足条件的执行代码 : 不满足条件执行的代码 接下来用一个小案例来展…

昇思25天学习打卡营第十四天|Pix2Pix实现图像转换

训练营进入第十四天&#xff0c;今天学的内容是Pix2Pix图像转换&#xff0c;记录一下学习内容&#xff1a; Pix2Pix概述 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN, Condition Generative Adversarial Networks &#xff09;实现的一种深度学习图像转换模型&#xff0c…