我用尽了洪荒之力,解开了ChatGPT 写前端代码的封印,结果...

news2024/11/17 11:54:43

d9b9d08edee25acde422422a5486e286.jpeg

我用尽了洪荒之力,解开了ChatGPT 写前端代码的封印

cb6cd0da47d4f06da15c4e1e8199e653.png

介绍

ChapGPT 听起来好得令人难以置信,所以让我们让它为我们编写一些 JS 代码。我想看看它是否可以解决我作为前端开发人员每天所做的任务。

是驴子是马拉出来溜溜,我们还是直接进入主题一探究竟。

在 React 中构建弹出框组件

虽然这是可能的,但我们不要通过添加一些代码来开始这个实验。让我们简单地要求 ChatGPT 创建两个 React 组件,这两个组件将成为弹出窗的元素和一个切换其可见性的按钮,一开始我是这么问的:

单独创建一个只有按钮(button)的React函数组件的文件,其名字是 ModalOpen。然后再单独创建一个叫 Modal 的函数组件文件,有个 div 在 Modal 函数组件里。

结果把我没有提及到的功能,弹出事件也写出来了,实在令我震惊!

1a4c9d2d9483a1d7c99f9ae7f64fa43c.png

ce79890a1790a163985001d9a03f69b7.png

大家看完以上截图是不是震惊?但是我不想让他这样实现我还未说的功能,我修改了创建代码的指令,修改如下:

单独创建一个只有按钮(button)的React函数组件的文件,其名字是 ModalOpen。然后再单独创建一个叫 Modal 的函数组件文件,有个 div 在 Modal 函数组件里。暂时不要包含事件,只是组件样式而已。

49f181e3c88fe58134eb559004f9c37a.png

0c45e94d38629d37dd21f5ea204dec21.png

这个简单的任务完成得很完美!请注意它如何主动向 HTML 元素添加一些内容,因为它清楚地了解它们的用途。更不用说底部的文字小注释很有帮助!

添加数据状态和事件

接下来,让我们直接进入一个复杂的任务,并要求它添加必要的功能以使按钮打开弹出框,我是这样给他修改组件代码指令的:

能否修改这些组件代码,让 ModalOpen 组件打开 Modal 组件弹出框呢

3158d22fb2cbb2f2e000d5aaea72d17e.png

15b845503eb8eecb3ce43c3feb91e890.png

再次,执行是完美的! ChatGPT 添加了必要的状态、点击事件侦听器和处理程序,以便所有这些都能正常工作。并且超额完成了任务,多实现了一个关闭弹出框的功能,我的指令并没有提及,看来他是个完美主义者。它给出的解释是还是十分完美的。我觉得这对初学者来说是一个很好的学习工具,因为它不仅可以满足您的要求,而且可以清楚地解释它。显然,在任何时候您都可以选择提出更多问题。

新建一个 ParentComponet 父组件

接下来,我们需要将这两个单独的组件,放到 ParentComponet 父组件,现在我们可以这样告诉 ChatGPT 让他们帮我们写一个 ParentComponet 父组件,指令提示语如下:

能否修改代码,将这两个组件引入 ParentComponet 组件里,方便我使用

d760b749ff8c42615f6eb63c23ae3f49.png

f68ead57bb5b93fa8d6c119351361712.png

0982e97410c111504904e21fed3ea3fe.png

没错,这个任务也是十分完美的完成了,而且文字注释我十分满意,到这里,你的感觉如何呢。

添加本地存储

接下来,我们提升门槛,让他完成更复杂的任务,测试它是否可以修改代码并将模态的状态保存在本地存储中。这允许我们即使在浏览器窗口关闭后也能保存模式的状态。接下来我给ChatGpt 如下提示语:

能否修改下 ParentComponent 组件的代码,将 isModalOpen 数据状态存储到本地缓存里(localStorage)?

70aed552b8f5402431569a2b783c7a8e.png

aaee31d3b812fb94a38aec467dcd4bb0.png

760e9041799dcaf68f616e4ccd2e0181.png

执行再次完美,它正确地将布尔值转换为字符串,它也向我们解释了为什么它必须在代码中使用 useEffect,这显然不仅仅是文档中的一般复制粘贴,解释是用我们在代码中的确切变量名称来帮助理解的,我简直不太详细这是个机器人完成的,再次刷新了我的认知。

添加样式和动画

好吧,让我们看看它是否可以与 CSS 和动画一起使用,我认为这对 AI 来说会更棘手一些,第一次我是这么问的:

你能否帮我添加一些 css 动画效果代码呢,当我们点击 ModalOpen 组件,让 Modal 的显示和隐藏效果更自然些。

c06685bcd8f081632a260909e4cf3d88.png

e42f07d187ee18748dcdd5ed465b8b50.png

7abcc95810afd45962de03505c6cc801.png

这段代码不仔细看,你以为它写对了,ChatGPT 也会打盹,一不小心也会糊弄过关,虽然乍一看是对的,但是父组件这样写 <Modal className={isModalOpen ? 'modal open' : 'modal close'} /> ,我们并没有在样式文件里定义 open 和 close ,其实在 open 和 close 加上这两个样式,本案例就完整了,还把本地缓存的逻辑搞丢了,但是我犯懒,不想自己写,继续让 AI 帮我改完吧, 看看能否满意。

接下来我下达修改的提示指令,看看他行不行,我是这样命令的:

请修复下样式文件,还有你把本地缓存的逻辑搞丢了,请修复你的代码

abb6d191e7c29210fbd107c575a90ae1.png

91f70f73405de61faae5a97c88f3e431.png

7b7eadaa2d29364b2a8fc0242594951c.png

到这里算是修复的让我满意,大家是否满意呢?看来AI也是会犯错的,需要人去辅助。

改成 TypeScript 版本的组件

接下来我们继续提高写代码的难度,让其将组件的代码改成 TypeScript 版本的,看看他能否完成呢,我给了以下提示语:

你好,你能将上述组件的代码给出 typescript 版本的组件吗,请完整写出所有组件的代码

5ad9f8584bff8861c13345f718d0ff35.png

由于截图问题,不能完整截图,我这里把最终完整的代码贴出来,大家一起帮忙来挑错,目前我没发现问题,实在另外哇塞,感觉我有魔法,让 ChatGPT 完成我的魔法,很有成就感。

// ModalOpen.tsx
import React from 'react';

interface ModalOpenProps {
  onClick: () => void;
}

const ModalOpen: React.FC<ModalOpenProps> = ({ onClick }) => (
  <button onClick={onClick}>Open Modal</button>
);

export default ModalOpen;
// Modal.tsx
import React from 'react';
import './styles.css';

interface ModalProps {
  isOpen: boolean;
  onClose: () => void;
}

const Modal: React.FC<ModalProps> = ({ isOpen, onClose }) => (
  <div className={`modal ${isOpen ? 'open' : 'close'}`}>
    <button onClick={onClose}>Close</button>
    <p>Modal content goes here</p>
  </div>
);

export default Modal;
// ParentComponent.tsx
import React, { useState, useEffect } from 'react';
import ModalOpen from './ModalOpen';
import Modal from './Modal';

const ParentComponent: React.FC = () => {
  const [isModalOpen, setIsModalOpen] = useState(false);

  useEffect(() => {
    const storedValue = localStorage.getItem('isModalOpen');
    if (storedValue) {
      setIsModalOpen(JSON.parse(storedValue));
    }
  }, []);

  useEffect(() => {
    localStorage.setItem('isModalOpen', JSON.stringify(isModalOpen));
  }, [isModalOpen]);

  return (
    <div className="App">
      <ModalOpen onClick={() => setIsModalOpen(true)} />
      <Modal isOpen={isModalOpen} onClose={() => setIsModalOpen(false)} />
    </div>
  );
};

export default ParentComponent;
// styles.css
.modal {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba(0, 0, 0, 0.5);
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  visibility: hidden;
  transition: all 0.3s ease-out;
}

.modal.open {
  opacity: 1;
  visibility: visible;
}

.modal.close {
  opacity: 0;
  visibility: hidden;
}

.modal p {
  background: white;
  padding: 1rem;
  border-radius: 0.5rem;
}

增加列表数据需求

接下来我们继续增加需求,在 Modal 组件里,增加一些属性,比如显示用户的姓名和头像。我是这样给 ChatGPT 提示语的:

你好,你能基于改写的 TypeScript 版本里,修改Modal 组件代码,在 Modal 组件里定义如下属性:firstName, lastName,profession,profilePhoto,这些属性都是字符串类型的,并在 Modal 组件里显示这些属性的内容。

82573dd5e3d5ffa7acac1ec60997aba3.png

import React from 'react';
import './Modal.css';

interface ModalProps {
  firstName: string;
  lastName: string;
  profession: string;
  profilePhoto: string;
  isOpen: boolean;
  onClose: () => void;
}

const Modal: React.FC<ModalProps> = ({firstName, lastName, profession, profilePhoto, isOpen, onClose}) => {
  return (
    <div className={`modal ${isOpen ? 'open' : 'close'}`}>
      <div className="modal-content">
        <span className="close-button" onClick={onClose}>×</span>
        <p>First Name: {firstName}</p>
        <p>Last Name: {lastName}</p>
        <p>Profession: {profession}</p>
        <p>Profile Photo: {profilePhoto}</p>
      </div>
    </div>
  );
};

export default Modal;

完美的!完全没有错误,但我的指示很清楚。我们知道它可以理解变量背后的含义,所以我怀疑它能够找出所需的类型(我们稍后会验证这一点)。像往常一样,我们得到了详细的解释,但它并不那么有趣,所以让我们继续前进。

你好,你能继续在 Modal 组件里,增加一个 hobbies 的对象数组属性吗,其结构如下 {nameOfHobby:string; experienceInYears:number; activelyDoing:boolean},修改完成后,请以表格的形式展现 hobbies 属性的数据,继续这些需求,请修改 Modal 组件代码

完成后的截图如,代码有点长,只截图部分:

fe777daf23c94f009a915e99a2ebdfd5.png

完整的代码如下,大家一起 Review 评审下,看看有啥问题吗,我暂时没发下,只能说不错完美。

import React, { useState } from 'react';

interface Props {
  firstName: string;
  lastName: string;
  profession: string;
  profilePhoto: string;
  isOpen: boolean;
  onClose: () => void;
  hobbies: { nameOfHobby: string; experienceInYears: number; activelyDoing: boolean }[];
}

const Modal: React.FC<Props> = (props) => {
  const {
    firstName,
    lastName,
    profession,
    profilePhoto,
    isOpen,
    onClose,
    hobbies,
  } = props;

  return (
    <div className={`modal ${isOpen ? 'open' : 'close'}`}>
      <button onClick={onClose}>X</button>
      <div className="profile-info">
        <img src={profilePhoto} alt="profile" />
        <div>
          <h2>
            {firstName} {lastName}
          </h2>
          <p>Profession: {profession}</p>
        </div>
      </div>
      <table>
        <thead>
          <tr>
            <th>Hobby</th>
            <th>Experience (in Years)</th>
            <th>Actively Doing?</th>
          </tr>
        </thead>
        <tbody>
          {hobbies.map((hobby, index) => (
            <tr key={index}>
              <td>{hobby.nameOfHobby}</td>
              <td>{hobby.experienceInYears}</td>
              <td>{hobby.activelyDoing ? 'Yes' : 'No'}</td>
            </tr>
          ))}
        </tbody>
      </table>
    </div>
  );
};

export default Modal;

您能看到它如何增加爱好,经验(年)以及目前在桌子标题上做的吗?而且它还理解,输出积极的布尔值,将其转换为“是”或“否”。实在令人经验,让我感觉到有压力了。

引入第三方库

接下来,让我们看看它是否可以按字母顺序对我们的爱好对象进行排序,并可能使用外部库来解决该问题,我是这样给他提示语的:

你好,在完成的 Modal 组件里,我想针对 hobbies 对象数组进行排序,依据 nameOfHobby 属性,你可以引入第三方库,请修改 Modal 组件代码

df6f255e4552fbf476e36f08b15e1010.png

完成的代码:

import React from 'react';
import { string, number, boolean, arrayOf } from 'prop-types';
import { sortBy } from 'lodash';

interface Hobby {
  nameOfHobby: string;
  experienceInYears: number;
  activelyDoing: boolean;
}

interface Props {
  firstName: string;
  lastName: string;
  profession: string;
  profilePhoto: string;
  hobbies: Hobby[];
  isOpen: boolean;
  onClose: () => void;
}

const Modal: React.FC<Props> = (props) => {
  const { firstName, lastName, profession, profilePhoto, hobbies, isOpen, onClose } = props;

  const sortedHobbies = sortBy(hobbies, ['nameOfHobby']);

  return (
    <div className={`modal ${isOpen ? 'open' : 'close'}`}>
      <div className="modal-header">
        <h2>{firstName} {lastName}</h2>
        <p>{profession}</p>
        <img src={profilePhoto} alt={`${firstName} ${lastName}`} />
      </div>
      <div className="modal-body">
        <h3>Hobbies:</h3>
        <table>
          <thead>
            <tr>
              <th>Name of Hobby</th>
              <th>Experience in Years</th>
              <th>Actively Doing</th>
            </tr>
          </thead>
          <tbody>
            {sortedHobbies.map((hobby) => (
              <tr key={hobby.nameOfHobby}>
                <td>{hobby.nameOfHobby}</td>
                <td>{hobby.experienceInYears}</td>
                <td>{hobby.activelyDoing ? 'Yes' : 'No'}</td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
      <div className="modal-footer">
        <button onClick={onClose}>Close</button>
      </div>
    </div>
  );
};

Modal.propTypes = {
  firstName: string.isRequired,
  lastName: string.isRequired,
  profession: string.isRequired,
  profilePhoto: string.isRequired,
  hobbies: arrayOf(
    shape({
      nameOfHobby: string.isRequired,
      experienceInYears: number.isRequired,
      activelyDoing: boolean.isRequired,
    }),
  ).isRequired,
  isOpen: boolean.isRequired,
  onClose: func.isRequired,
};

export default Modal;

再次完美执行:它决定使用lodash,导入它并写出逻辑以按我们要求的属性进行排序。再次,非常令人印象深刻!

结束

好了,本次测试就到这里,我们就不再折腾 ChatGPT 了,他估计也累了。

本次试验,我努力尝试打破它,让他犯错,但它几乎完美地执行了我的指示,并且似乎理解诸如“爱好”之类的变量的潜在含义,因为它主动添加了我不需要要求的更多需求。

它完美地实现了 React 组件、事件监听器、处理本地存储、样式、动画、使用外部库和 TypeScript 类型,以及数据排序的功能。

就我个人而言,(目前)我并没有感到受到威胁,因为我认为它可以执行简单而微不足道的任务。很明显,您需要成为一名经验丰富的开发人员,才能围绕架构和实施做出复杂的创造性决策,否则您无法让AI帮你完成简单的开发任务,你需要不断地让AI帮你修正错误。

在目前的阶段,我可以将其视为一个 VSCode 插件:我不用打字,而是通过语言提示,让 AI 为我构建元素,在几秒钟内快速完成通常需要我需要花费 5-10 分钟的重复性任务。正如我们在本测试中看到的那样,它的表现非常出色!

人工智能虽然很可怕,但最终,它有可能消除我们工作中不需要创造性思维的重复、无聊的事情。因此,我们可以更快地完成任务,并能够将更多时间花在我们真正喜欢做的事情上!

你怎么看待这件事??这将如何改变我们今天所知道的职业?作为开发人员,您将如何将其纳入您的工作流程?这将如何影响整个行业?

今天的分享就到这里,这是我的一些尝试,你是怎么用ChatGpt写代码的,欢迎在评论区分享。感谢你的阅读,如果你喜欢我的分享,别忘了点赞转发,让更多的人看到,最后别忘记点个关注,你的支持将是我分享最大的动力,后续我会持续输出更多内容,敬请期待。

思路来源:
https://medium.com/bitsrc/i-asked-chatgpt-ai-to-write-react-and-javascript-for-me-and-i-was-shocked-detailed-analysis-d68d55be7746

作者:Mate Marschalko

注释:非翻译,有中文示例改编和案例增加

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

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

相关文章

Vite + Vue3 +Vant4构建项目时,按需引入使用Toast组件,引用 showToast 时出现编译报错的解决方案

Vite Vue3 Vant4构建项目时&#xff0c;按需引入使用Toast组件&#xff0c;引用 showToast 时出现编译报错的解决方案 文章目录Vite Vue3 Vant4构建项目时&#xff0c;按需引入使用Toast组件&#xff0c;引用 showToast 时出现编译报错的解决方案一.问题定位二.以下为完整解决…

React+Mobx|基本使用、模块化

欢迎来到我的博客 📔博主是一名大学在读本科生,主要学习方向是前端。 🍭目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 🛠目前正在学习的是🔥 R e a c t 框架 React框架 Reac

【小程序项目开发 -- 京东商城】uni-app 商品分类页面(上)

&#x1f935;‍♂️ 个人主页: 计算机魔术师 &#x1f468;‍&#x1f4bb; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f310; 推荐一款找工作神器网站: 点击跳转牛客网 |笔试题库|面试经验|实习招聘内推| 还没有账户的小伙伴 速速点击链接…

前端 --- HTML

文章目录1. HTML 结构1.1 HTML 文件基本结构1.2 VsCode 中 使用 HTML 的快捷键2. HTML 常见标签2.1 注释标签2.2 标题标签2.3 段落标签2.4 换行标签2.5 格式化标签2.6 图片标签2.7 超链接标签2.8 表格标签2.9 列表标签2.10 表单标签form 标签input 标签① 文本框② 密码框③ 单…

Vue中实现路由跳转的三种方式详细分解

vue中实现路由跳转的三种方式 目录 vue中实现路由跳转的三种方式 一、使用vue-router 1.下载vue-router模块到当前工程 2.在main.js中引入VueRouter函数 3.添加到Vue.use()身上 – 注册全局RouterLink和RouterView组件 4.创建路由规则数组 – 路径和组件名对应关系 5…

CSS flex布局最后一行左对齐的常用方法

一、justify-content 在CSS flex布局中&#xff0c;justify-content属性定义了浏览器之间&#xff0c;如何分配顺着弹性容器主轴 (或者网格行轴) 的元素之间及其周围的空间&#xff0c;可以控制列表的水平对齐方式&#xff0c; justify-content: center; /* 居中排列 */ …

Visual Studio 2022 给创建的类/接口加头注释

Visual Studio 2022 给类加注释 找到文件路径 一般在C盘&#xff1a; C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\IDE\ItemTemplates\CSharp\Code\2052\Class 如图&#xff1a; 修改这个.cs文件 using System; using System.Collections.Generic…

Linux驱动开发——串口设备驱动

Linux驱动开发——串口设备驱动 一、串口简介 串口全称叫做串行接口&#xff0c;通常也叫做 COM 接口&#xff0c;串行接口指的是数据一个一个的顺序传输&#xff0c;通信线路简单。使用两条线即可实现双向通信&#xff0c;一条用于发送&#xff0c;一条用于接收。串口通信距…

C++ Linux Web Server 面试基础篇-计网(一)

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

纯代码22步绘制唯美的日夜交替动画(原生HTML+CSS+JS实现,CV即可运行+保姆级步骤教程)

文章目录前言一、HTML(index.html)1. 加入元素二、CSS(style.css)2. 重置浏览器样式3.设置字体样式4.将我们的元素居中5.设置背景颜色6.设置动画显示的位置7.设置夜晚时的背景色8.将动画显示的区域设置为圆型9.绘制白天时天空的样子10.绘制夜晚时天空的样子11.创建昼夜交替动画…

vue3 项目搭建教程(基于create-vue,vite,Vite + Vue)

vue3 项目搭建教程&#xff08;基于create-vue&#xff0c;vite&#xff0c;Vite Vue&#xff09; 目录 一、搭建vue3 项目前提条件 二、通过create-vue搭建vue3 项目 三、搭建一个 Vite 项目 四、构建一个 Vite Vue 项目 五、打开Vue 项目管理器 六、Vite Vue 项目目…

Vue.js笔记------事件

一、事件与事件流 1、事件与事件流 【事件】 JavaScript中的事件&#xff0c;可以理解就是在HTML文档或者浏览器中发生的一种交互操作&#xff0c;使得网页具备互动性。常见的有加载事件、鼠标事件。 【事件流】 由于DOM是一个树结构&#xff0c;如果在父子节点绑定事件时候&am…

前端使用xlsx导出数据生成Excel文件

xlsx的使用安装 xlsx引入 xlsx需要导出的数据源将数据源转成需要的二维数组定义 Excel 表头将定义好的表头添加到 body 中1 创建虚拟的 workbook2 将二维数组转成 sheet!merges 设置单元格合并!cols 设置列宽!rows 设置行高3 向 workbook 中添加 sheet4 导出 workbook 完整示例…

JavaWeb 简单的图书管理系统(jsp+servlet)

关于与需要的文件下载字体颜色分类:黑色 表示正文蓝色 表示一个超链接&#xff0c;点击可以跳转页面橙色 表示一级标题或项目的包名绿色 表示子级内容中含有代码或解释的标题紫色 表示一个代码块的标题红色 表示()外的文件是()内文件的子类,实现类或依赖浅灰 表示解释或其类型高…

Vue封装Axios实现全局的loading自动显示效果

在 vue 项目中&#xff0c;我们通常会使用 Axios 库来与后台进行数据交互。而当我们发起 ajax 请求时&#xff0c;常常需要在页面上显示一个加载框&#xff08;Loading 效果&#xff09;&#xff0c;然后等数据返回后自动将其隐藏。要实现这个功能&#xff0c;我们可以在每次请…

尚品汇前台项目总结

这是我的第一篇个人博客&#xff0c;主要是对我学习前端过程中的一些主记录。由于我在江苏&#xff0c;从2022年过完年&#xff0c;一直到年中&#xff0c;疫情反反复复&#xff0c;又正是大三&#xff0c;马上面临就业难题&#xff0c;我选择了前端。 从html,css,js基础,webAP…

15个awk的经典实战案例

目录 一、插入几个新字段 二、格式化个空白 三、筛选IPV4地址 命令及结果 第一种查询方式 第二种查询方式 第三种查询方式 四、读取.ini配置文件中的某段 命令及结果 第一种查询方式 第二种查询方式 五、根据某字段去重 命令及结果 第一种方式 第二种方式 六、…

你是这样的 CSS,19个唯美的边框

作者&#xff1a;niemvuilaptrin 译者&#xff1a;前端小智 来源&#xff1a;medium 有梦想&#xff0c;有干货&#xff0c;微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录&#xff0c;有一线大厂面试完整…

Vue之插槽

1. 插槽是什么 插槽就是子组件中的提供给父组件使用的一个占位符&#xff0c;用 表示&#xff0c;父组件可以在这个占位符中填充任何模板代码&#xff0c;如 HTML、组件等&#xff0c;填充的内容会替换子组件的标签。简单理解就是子组件中留下个“坑”&#xff0c;父组件可以使…

STM32入门教程课程简介(B站江科大自化协学习记录)

课程简介 STM32最小系统板面包板硬件平台 硬件设备 STM32面包板入门套件 Windows电脑 万用表、示波器、镊子、剪刀等 软件介绍 Keil MDK 5.24.1 是一款嵌入式软件开发工具&#xff0c;它提供了一个完整的开发环境&#xff0c;包括编译器、调试器和仿真器。它支持各种微控制…