体验ChatGPT在具体应用场景下的能力与表现——vuedraggable的move多次触发问题

news2024/11/15 13:36:00

当下人工智能模型在满天飞,今天拿一个具体的应用场景,来体验下ChatGPT的能力与表现,看看是否能解决实际问题。
顺便填一下之前遇到的一个具体的坑:vuedraggable的move多次触发问题。

背景

背景是这样的,实现低代码开发平台过程中,使用vuedraggable组件,通过拖拽式操作实现属性配置功能。如下图所示:

获取到业务实体的属性列表,放到最左侧,然后,通过拖动的方式,将某个属性,设置为查询条件或查询结果。

问题

当时留了一个坑,要解决的是如何处理属性重复添加问题,大致情况如下:
vuedraggable只要拖放,立马就能看到效果,例如,从左侧实体属性列表,拖放到右侧查询条件。但在这个场景下,实际上,需要判断下右侧属性列表是否已存在,如不存在,则允许添加,如存在,则不再添加。后端的验证处理是小case,就不在这里多说了,关键是前端该怎么处理。

看了半天官方文档,没找到合适的控制,又百度了半天,也没有满意的结果,自行摸索,终于发现move事件可以用。实际上,官方对于move的定位,是用来自定义控制那些元素可以拖拽或不允许拖拽并控制是否允许停靠的。我们这里就是希望控制是否允许停靠。

首先,一个坑点是,move虽然是事件,但不是我们常用的,用@move='move’来触发,而是使用了属性绑定的方式,用:move=‘move’,这点有点反常理,我就卡了一会,发现事件不触发,详细看文档才发现问题在这。

其次,在我们这个场景下,move属性,绑在左侧实体属性组件,还是右侧查询条件组件上,从是否允许停靠描述看,好像应该放到右侧,但实际测试发现,从左侧拖到右侧,根本就不触发,因此这个move,实际是针对源列表而言的。

再次,实际测试发现,存在触发多次问题,怀疑跟前端的事件冒泡机制有关,摸索了半天,也没找到只触发一次的办法。

// 移动
    move(e) {
    // TODO 存在触发多次问题    
    const code = e.draggedContext.element.code
    const list = e.relatedContext.list
    const exist = list.some(item => { return item.code === code })
    // if (exist) {
    //   this.$message.info('已存在,请勿重复添加')
    // }
    return !exist
    }

详见https://blog.csdn.net/seawaving/article/details/128083596

测评过程

这篇帖子大概是2022年12月份发布的,到现在4个多月,也没见有人评论告知如何解决。
输入关键词搜索,下图是百度结果……排名第一位的居然是我自己的博文……不得不说,CSDN的权重还是很给力的。
搜索结果看了下,还是没有问题的答案。
image.png
之前零星用过ChatGPT,大都是第三方封装的,限量使用,只能问有限的问题,并且经常出现繁忙的答复。今天发现一个不限量使用的客户端工具,也不需要OpenAI的key,于是装上了,正好借这个场景来测试下。

第一回合

先来点开胃小菜,试试ChatGPT的智能化程度,能不能正确理解问题并给出有效答复。
第一个问题:如何实现vue中的拖拽功能
回答结果如下:
首先,直接就推荐了vuedraggable,并且提供了该组件的安装命令
image.png
然后提供了使用的示例代码。
image.png
最后还给了示例的说明。
image.png
上面三张截图是一个问题和一个回答,一气呵成,并没有中途附加追问,这回答简洁直观,实用性很强。

接下来,我看上面的例子是对于vue2.0的,然后追加了一句,在vue3.0如何实现,结果是跟上面给的结果完全一样。
作为一名从vue2.0升级到vue3.0的开发者,清晰的知道vuedraggable在新旧版本的用法是有差异的,vue2.0的用法在vue3.0中会报错。vue3.0引入了名字为item的插槽,用法如下:

      <draggable v-model="list" item-key="index">
          <template #item="{ element }">
           {{ element.name }}
          </template>
        </draggable>

于是追问了一句:vue3和vue2中vuedraggable的用法一样吗?
image.png
结果还是不理想,在ChatGPT的认知里,vuedraggable在Vue2.0和Vue3.0用法是完全一样的。

总结:能正确理解问题,并给出简洁实用的答复,但答案不一定准确。虽有瑕疵,但总体来说表现不错。

第二回合

回归正题,也就是要填的坑,开问:vuedraggable的onMove如何解决多次触发问题
image.png
给出的答案是个惊喜,ChatGPT知道这里存在坑:

在Vue.js中使用vuedraggable时,onMove事件会在拖动元素时多次触发,这可能会导致性能问题。

更为惊喜的是,直接给出了解决方案,还一次性给了俩:

为了解决这个问题,可以使用throttle或debounce函数来限制事件的触发次数。
throttle函数可以在一定时间内限制函数的调用次数,而debounce函数可以在函数最后一次调用后一定时间内才会再次调用函数。这两个函数都可以有效地解决onMove事件多次触发的问题。

并且对于第一个解决方案,给了示例代码:

import { throttle } from 'lodash';

export default {
  methods: {
    handleMove: throttle(function(event) {
      // 处理拖动事件
    }, 100)
  }
}

并给了方法的使用说明,以及参数含义:

在这个示例中,handleMove方法使用throttle函数来限制onMove事件的触发次数。throttle函数的第二个参数是时间间隔,单位是毫秒。在这个示例中,事件将在100毫秒内最多触发一次。

我以前没用过throttle函数,虽然从示例代码推测可能是一个名字为lodash的包提供的,但并不能确定,于是追问了下,vue中method区域使用throttle,回答如下:
image.png
这可比搜索引擎强多了,直接给出安装脚本。如果按照常规方式,得先百度,然后从搜索结果里逐条查看,哪条是自己需要的。这个过程中还需要去伪存真……现在同样内容转发太多了,自己不做验证,以讹传讹的情况非常常见。

这里给的方案,只是减少调用频率,并没有实现只触发一次的终极目的。既然已经到这里了,进一步逼下ChatGPT,看看是否有潜能。
image.png
给出的方案依旧是上面的,不理想,再追问了一下。
image.png
用上面这种方法试了下,确实只会触发一次,但问题在于,从左侧属性列表中刚开始拖动,尚未到右侧查询条件区域就触发了,结果就是导致拖拽功能直接异常了,即拖放失效,无法添加属性。

上面这个回答,实际脱离了vuedraggable的move事件处理了,于是结合起来问,结果还真给出了新方案:
image.png
不过,方案虽然是新的,实际跟第三方的once函数的机理差不多,效果也差不多。

实际上,这里ChatGPT提供的方案还有个错误,就是move是一个属性,而不是事件,用:move而不是@move来绑定,因此这种方案vue解析直接会出错。

回过头来思考了一下这个问题,如果想从根源上实现属性在列表中拖动,只触发一次效果,那应该是vuedraggable组件提供相应的事件,即拖动到指定位置后松开鼠标左键时触发。

vuedraggable组件有end事件,但是这个事件不像move,返回false可以取消操作,而是一定会成功,即从前端看,把一个属性,从左侧列表拖到了右侧列表,无论右侧列表是否已存在。虽然可以从后端去验证和处理,并刷新右侧列表,但不可避免还会出现先出现后消失的闪烁情况,效果并不好。

当初就是发现end事件不能取消拖拽,才拿move作为曲线救国方案来实现的。因此,当下最优解决方案,实际就是使用throttle函数,来减少触发次数,经反复试验,将间隔时间设置为500毫秒比较合适,能大幅减少触发次数,且不会让拖拽操作显得卡顿。

顺便提一下,期待vuedraggable组件将来能改造下end事件,变成可取消。

补一点后续:
第二天再次尝试提问,给出了一个新的解决方案
在这里插入图片描述
测试了下,对于我的当前场景跨列表拖动并有没有效果,实际是用于单组件内部拖动控制的。

总结:聚合处理后的结果远优于搜索引擎,节省了人工查看分析结果的成本,答案基本靠谱。

第三回合

下面进入深度测评,针对信息有误的情况,看看是否能通过回答来纠正ChatGPT的认知。
就以vuedraggable组件的move是属性还是事件来提问。
先问下,vuedraggable的事件有哪些,回答如下:
image.png
可以看到,并不包含move。

但是,再提问vuedraggable的move如何使用
image.png
答复却是把move定义为事件,给出的绑定方式是@move,明显是前后矛盾的。
为什么会出现这个问题?推测情况可能有两种,一是vuedraggable组件的某些版本可能确实将move作为事件而不是属性处理的;二是网上转发,自己不做验证,以讹传讹的太多了,导致ChatGPT输入了大量错误结果而出现了认知错误。具体是哪一种,我也不知道:)。
image.png
咱们试着通过修正下
image.png
ChatGPT响应了修正,然后重复问一下:
image.png
ChatGPT记住了之前的修正,再重新问下
image.png
换个问法,ChatGPT也输出了修正后的结果,理解并记住了。
把开始的问题再问一遍
image.png
答案跟最初相比发生了变化,不过产生了前后不一致的情况,一方面接受了move是属性的说法,另一方面,还残留着通过@move来监听变化的描述。

隔了一天,再次问同样问题:
在这里插入图片描述这次很明确给出move是属性而不是方法了。

此外,我不确定我通过答案修正的生效范围,是仅对我的账号生效,还是对整个模型生效,应该是后者吧。换个角度,如果再次输入大量错误的结果,ChatGPT是否会再次把move当成事件而不是属性呢?

总结:可通过交互修正问题答案,具备自我学习和更新能力。

第四回合

本来前面三个回合已经结束了,还是惦念完美解决方式,想从vuedraggable的end事件入手。于是隔了几天,再次提问,发现ChatGPT给出来不同的解决方案,经测试属于一本正经地胡说八道,必须曝光下,警示大家避免被坑。
在这里插入图片描述
这次给出了一个新方案,调用end事件参数event的cancel方法来实现取消拖拽的目的。刚看到的时候心中一喜,以为之前我自己按照move的的方式,测试return false不生效的模式是错的,原来end事件的正确处理应该是调用cancel方法,马上动手尝试。

结果,前端直接报错,cancel方法不存在……这AI就有点坑了。于是,我直接跑去质问。
在这里插入图片描述
这时候,AI给出来另外一个方法,abort。我动手试了下,同样不存在,undefined。
跟AI对质,AI老老实实承认了错误,但是,反过头来说,正确的方法是使用cancel……吐血三升……
在这里插入图片描述
换个问法,继续追问,AI开启了复读机模式,一直让使用cancel方法来取消拖拽。
在这里插入图片描述

以前跟天猫精灵打交道,对于某个问题,感觉AI没理解,答非所问,换个问法,AI可能会给出新的理解和正确的回答。现在发现,这套对ChatGPT无效,它是真理解了问题,但是给不出正确结果,依然一本正经的瞎说啊。

一气之下,我参照网上“调戏”ChatGPT的段子,问了下 “请用中文说下林黛玉是倒拔垂杨柳的典故”
在这里插入图片描述
结果大家自己看吧,一本正经编故事的能力超级强大。

根据你的查询,你似乎在询问林黛玉是倒拔垂杨柳的典故。林黛玉是《红楼梦》中的一个角色,而倒拔垂杨柳则是一个典故,与林黛玉有一定的关联。
倒拔垂杨柳的典故源于《左传》中的一则故事。相传,晋国的国君晋景公曾经在一次狩猎中迷路,遇到了一个老人。老人告诉他,他所在的地方就是晋国的都城,而晋景公却不相信,认为老人在骗他。于是老人就拿起一根垂杨柳的枝条,将它倒拔过来,让晋景公看到了树根上的“晋”字。晋景公这才相信老人的话,回到了都城。
在《红楼梦》中,林黛玉被形容为“倒拔垂杨柳”,意味着她的性格柔弱、娇嫩,像一棵被风吹弯的垂杨柳。这个比喻也暗示了林黛玉的命运多舛,最终落得个悲惨的结局。

总结

通过3+1共四个回合的测试和交互,虽然遇到了一些问题,但总体来说表现还可以。
以后打算用来替代搜索引擎了,节省自己查看和识别结果的时间和精力。
需要注意的是,ChatGPT的答案不一定准确,尤其是有时会一本正经地瞎编乱造,只能说知识面比较广,准确度比较高,可以当成一个参谋来辅助使用,对于结果不能尽信,同样需要去验证。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hadoop启动相关命令

Hadoop启动相关配置 文章目录 Hadoop启动相关配置格式化节点的情况什么情况下Hadoop需要进行格式化节点&#xff1f; Hadoop启动步骤Hadoop的启动步骤只是start-dfs.sh即可吗 *hdfs*的web管理页面参数说明参数的评价场景 格式化节点的情况 什么情况下Hadoop需要进行格式化节点…

赛效:怎么用改图鸭进行一键Logo设计?

改图鸭工具是一款在线图像处理工具&#xff0c;可以对图片进行大小调整、添加色彩、滤镜等&#xff0c;用户使用改图鸭可快速轻松地对多种图像进行处理操作&#xff0c;另外&#xff0c;改图鸭工具还支持一键进行Logo设计&#xff0c;很多人对改图鸭工具比较陌生&#xff0c;不…

rsync 服务器备份代码

rpm -qa | grep rsync #检查rsync软件是否存在 yum -y install rsync #安装rsync服务 systemctl start rsyncd #启动rsync服务 systemctl enable rsyncd #加入rsync开机启动 systemctl reload rsyncd #重新加载rsync netstat -lnp|grep 873 #检查是否已经成功启动 firewall…

【代码随想录】刷题Day2

1.左右指针比大小 977. 有序数组的平方 class Solution { public:vector<int> sortedSquares(vector<int>& nums) {vector<int> ret nums;int left 0;int right nums.size()-1;int end nums.size();while(left<right){if(abs(nums[left])>abs…

vue-element-admin-master编译异常记录

前言 最近一直在往大前端的方向转&#xff0c;不得不说前端的知识架构还真的很庞大&#xff0c;一步一个脚印吧&#xff0c;之前消化完极简版后台项目[vue-admin-template-master]后&#xff0c;开始想看下完整版的后台[vue-element-admin-master]项目&#xff0c;奈何clone项…

ChatGPT实战100例 - (08) 设计转化为SQL并获取ER图

文章目录 ChatGPT实战100例 - (08) 设计转化为SQL并获取ER图一、需求与思路二、SQL建表三、绘制四、 总结 ChatGPT实战100例 - (08) 设计转化为SQL并获取ER图 一、需求与思路 在你还在手撸SQL&#xff1f;ChatGPT笑晕在厕所 这篇博文中 针对经典3表设计&#xff1a; 学生表 S…

【我在CSDN成长】我的两周年创作纪念日

【我在CSDN成长】我的两周年创作纪念日 一、来到CSDN的大家庭二、在CSDN的收获1.在CSDN的感受2.在CSDN的收获 三、在CSDN的未来规划憧憬 一、来到CSDN的大家庭 当看到这个信息时&#xff0c;才发现不知不觉已经在CSDN创作两年了&#xff0c;今天才腾出时间来写下这篇博文。感叹…

绕开坑坑,申请高德地图安卓appKey的步骤

在申请高德地图 appkey的时候&#xff0c;我们会采用keytool的方法来生成sha1码。这里面有坑&#xff0c;请看 PS C:\Users\cuclife.android> keytool -v -list -keystore keystore keytool 错误: java.lang.Exception: 密钥库文件不存在: keystore java.lang.Exception: 密…

涨点技巧:IOU篇---Yolov5/Yolov7引入WIoU,SIoU,EIoU,α-IoU

1.IOU介绍 IoU其实是Intersection over Union的简称,也叫‘交并比’。IoU在目标检测以及语义分割中,都有着至关重要的作用。 首先,我们先来了解一下IoU的定义: 我们可以把IoU的值定为为两个图形面积的交集和并集的比值,如下图所示: 1.1 Yolov5自带IOU方法 GIoU, DIoU,…

Kubernetes(k8s 1.23.17) 基于docker 一主两从集群环境搭建

结合网上资料&#xff0c;利用k8s最后直接支持docker的版本1.23.17搭建&#xff0c;并本地验证完成。 1 虚拟机准备 1.1 规划 系统角色/hostnameIP地址配置CentOS 7.9 &#xff08;需要7.5&#xff09;master192.168.68.1002Core、4G内存、40GB磁盘CentOS 7.9 &#xff08;需…

一篇文章告诉你,为什么移动数据捕获对运输物流公司很重要?

随着世界走向数字化和智能手机的使用增加&#xff0c;移动数据采集正在成为大多数行业的新常态。航运物流也不例外。从捕获详细的订单和交付信息到跟踪货运和仓库位置&#xff0c;条形码技术用于运输物流世界的每一步。通过智能数据采集&#xff0c;运输和物流公司可以获得更好…

camunda的service task如何使用

在 Camunda 中&#xff0c;使用 Service Task 节点可以执行各种类型的业务逻辑&#xff0c;例如计算、数据转换、数据格式化等。在 Service Task 节点中&#xff0c;可以使用不同的编程语言来实现业务逻辑&#xff0c;例如 Java、JavaScript、Python 等。 下面是使用 Java 实现…

生产制造企业如何建立适合自身的数字化工厂,实现数字化转型?

“工业4.0”这一全新的术语受到全球的瞩目&#xff0c;它是继机械化、电气化和信息技术之后&#xff0c;以智能制造为核心的第四次工业革命。“工业4.0”最显著的特征是智能工厂的广泛普及。而智能工厂是在数字化工厂的基础上发展而来的&#xff0c;没有数字化就没有智能化。因…

如何在低代码平台上构建ERP软件

ERP软件是企业管理日常运营需求的关键组件。然而&#xff0c;对于许多企业&#xff0c;尤其是资源有限的企业来说&#xff0c;尝试构建和管理ERP平台可能要担负较高的成本的。幸运的是&#xff0c;低代码平台可以使这个过程变得容易得多。今天我们来解释如何在低代码平台上构建…

【IDEA】数据湖 Hudi 0.12.0 基础使用

文章目录 创建 Maven 项目插入数据查询数据更新数据增量查询删除数据 前言 集群系统&#xff1a;CentOS 7.5 服务器信息&#xff1a; 服务器角色IPhadoop104服务器Master192.168.0.104hadoop105服务器Slave1192.168.0.105hadoop106服务器Slave2192.168.0.106 使用的组件版本…

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题977有序数组的平方) 2023.4.20

目录 前言算法题&#xff08;LeetCode 977有序数组的平方&#xff09;—&#xff08;保姆级别讲解&#xff09;分析题目算法思想&#xff08;重要&#xff09;暴力解法代码&#xff1a;双指针法&#xff08;快慢指针法&#xff09;代码&#xff1a; 结束语 前言 本文章一部分内…

C++ Primer (第五版)-第九章 顺序容器

文章目录 一、概述二、内容9.1、顺序容器概述如何选择合适的容器 9.2、容器库概览迭代器容器类型成员列表初始化赋值和Swap容器的大小关系运算符 9.3 顺序容器操作9.3.1向顺序容器添加元素访问元素删除元素改变容器大小 9.4 Vector 对象如何增长9.5、额外的string 操作9.5.2、改…

【散文诗】单片机运行下和非运行下的 ROM 和 RAM

目录 一、两种处理器的结构体系1. 哈佛结构体系2. 冯诺依曼结构体系3. 两种结构的总结 二、单片机运行下和非运行下的内存分配1. 非运行时的单片机程序在ROM内的分布2. 运行时的单片机程序在RAM内的分布 三、单片机程序和操作系统应用程序的对比四、编译流程 一、两种处理器的结…

Java 8 中使用 Lambda 表达式和 Stream API 解决 LeetCode 的两数之和问题

Java 8 中使用 Lambda 表达式和 Stream API 解决 LeetCode 的两数之和问题 当我们在面对一个数列&#xff0c;需要查找其中两个元素的和为给定目标值时&#xff0c;可以使用两数之和&#xff08;Two Sum&#xff09;问题来解决。这个问题在 LeetCode 上有很高的重要性和普遍性&…

入行IC| 数字IC设计和验证哪个好?(内含薪资对比)

网上有一个很火的问题那就是数字IC设计和验证哪个好&#xff1f;接下来我们从以下几个维度来对比一下这两个岗位。 入行门槛 从上述对比就可以看出&#xff0c;IC设计要比验证门槛高。 具体工作内容有哪些&#xff1f; 数字IC前端设计 1.配合芯片架构的设计&#xff1b;一…