全栈开发03-能懂嘴就不动手

我们框架使用到的前端技术有React、Tailwind和Shadcn,Shadcn是一个ui框架,Tailwind是一个样式组件,而本节要介绍的一个编程助手就是Shadcn这家公司Vercel推出的v0.dev。Vercel公司还有前端很流行的开发脚手架Nextjs。

这次介绍如何使用v0帮助我们生成页面。

使用V0

万事开头难,当我们需要开发一个新页面的时候,就会对着IDE发呆。如果说有原型图还好说,如果没有,那么我们就得对着需求自己想了。大概你会想着把原来写过的代码拿过来粘贴一下,然后做一些修改,原来这个代码大概就是个列表页。

那么现在有了大模型的加持,很多工作流程就可以发生变化了。这里我们使用v0来尝试开发一个页面。

这是v0的首页,一个输入框,你告诉它,你想生成什么样子的页面,他就会帮你生成,同时会提供生成页面的预览。

如果一次生成的效果不满意,可以继续告诉它你要怎么修改,它会继续帮你去完善这个页面,当页面达到你的要求的时候,你就可以通过直接复制这个代码或者使用安装命令安装到你的项目中去。

当然,你如果有现成的页面样式,比如原型图或者其他网站你喜欢的页面,可以把页面参考图给它,让它帮你照着生成。不过一般情况下,第一次效果都不会满意,多跟它对话几次,让它帮你去修改,直到满意为止。

比如说,我想让他帮我照着如下参考图生成页面:

我会把这个页面上传给它,让它帮我生成。

以上是它第一次生成的页面,当然有些地方不一致,可以让它继续修改,红框的地方是生成的代码,右上角的CLI图表是可以拷贝,然后在项目中运行,当运行命令后,这个生成的代码就会以这个文件名出现在你的src/components/ui文件夹下,你就可以在页面中引入了。

值得注意的是,这个工具每天有免费使用次数,大概10次左右吧,完全可以帮助你生成2个新页面了。

这个工具生成的页面会有一些交互,但一般不够用,需要进行修改,比如访问后台数据,一些更复杂的逻辑处理等。

使用ChatGPT

下面让我们请出ChatGPT,它同样可以完成页面生成,它也可以实现页面的逻辑。

这里是一个例子。

shadcn提供的组件一般不包含逻辑,这里需要我们自己去补充逻辑信息。这里我们拿Pagination组件举例。

我们看它的代码使用,非常简单,没有任何交互功能。

react 复制代码
<Pagination>
  <PaginationContent>
    <PaginationItem>
      <PaginationPrevious href="#" />
    </PaginationItem>
    <PaginationItem>
      <PaginationLink href="#">1</PaginationLink>
    </PaginationItem>
    <PaginationItem>
      <PaginationEllipsis />
    </PaginationItem>
    <PaginationItem>
      <PaginationNext href="#" />
    </PaginationItem>
  </PaginationContent>
</Pagination>

那么,如果我们需要把它封装成一个分页组件,包含点击事件、显示条数、总数等,如果让我们自己去写,逻辑会比较复杂,也可能写出bug。这个时候,我们把这段代码发送给ChatGPT让它帮我们生成带逻辑的分页组件。

这样子,效率更高,代码质量更好,何乐而不为?

这是经过3轮对话,让它帮我生成的代码:

javascript 复制代码
import {
    Pagination,
    PaginationContent,
    PaginationEllipsis,
    PaginationItem,
    PaginationLink,
    PaginationNext,
    PaginationPrevious
} from "@/components/ui/pagination";
import React from "react";

const Pager = ({page, pageSize, rows, total, onPageChange}) => {
    // Calculate total pages
    const totalPages = Math.ceil(total / pageSize);
    const handlePageChange = (page) => {
        if (page >= 1 && page <= totalPages) {
            onPageChange(page)
        }
    }

    // Generate pagination items
    const renderPaginationItems = () => {
        const items = [];

        // Add first page
        if (page > 3) {
            items.push(
                <PaginationItem key={1}>
                    <PaginationLink
                        onClick={() => handlePageChange(1)}
                        isActive={page === 1}
                        className='cursor-pointer'
                    >
                        1
                    </PaginationLink>
                </PaginationItem>
            );

            // Add '...' after the first page if needed
            if (page > 4) {
                items.push(
                    <PaginationItem>
                        <PaginationEllipsis/>
                    </PaginationItem>
                )
            }
        }

        // Add pages around the current page
        for (let i = Math.max(1, page - 2); i <= Math.min(totalPages, page + 2); i++) {
            items.push(
                <PaginationItem key={i}>
                    <PaginationLink
                        onClick={() => handlePageChange(i)}
                        isActive={page === i}
                        className='cursor-pointer'
                    >
                        {i}
                    </PaginationLink>
                </PaginationItem>
            );
        }

        // Add '...' before the last page if needed
        if (page < totalPages - 3) {
            items.push(
                <PaginationItem key={'...'}>
                    <PaginationEllipsis/>
                </PaginationItem>
            )
        }

        // Add last page
        if (page < totalPages - 2) {
            items.push(
                <PaginationItem key={totalPages}>
                    <PaginationLink
                        onClick={() => handlePageChange(totalPages)}
                        isActive={page === totalPages}
                        className='cursor-pointer'
                    >
                        {totalPages}
                    </PaginationLink>
                </PaginationItem>
            );
        }

        return items;
    };

    return (
        <div className='flex justify-between w-full'>
            <Pagination>
                <PaginationContent>
                    <PaginationItem>
                        <PaginationPrevious onClick={() => handlePageChange(page - 1)} className='cursor-pointer'/>
                    </PaginationItem>
                    {renderPaginationItems()}
                    <PaginationItem>
                        <PaginationNext onClick={() => handlePageChange(page + 1)} className='cursor-pointer'/>
                    </PaginationItem>
                </PaginationContent>
            </Pagination>
            <div className="text-xs text-muted-foreground w-64">
                显示 <strong>第{page}页</strong> - <strong>{rows}条记录</strong> - <strong>总数:{total}</strong>
            </div>

        </div>
    )
}

export default Pager

代码很规整,还包含注释,我想它写的代码比我们大多数人都好。

最后

ChatGPT们已经深入到了我们的工作中,目前它们的能力可以很好的扮演编程助手的工作,而我们需要掌握如何使唤它,如何更好的使唤它。我们可以更少的自己动手写东西了,但我们需要更广泛的知识面去指挥它干活。

相关推荐
Elastic 中国社区官方博客1 分钟前
Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
jwolf22 分钟前
摸一下elasticsearch8的AI能力:语义搜索/vector向量搜索案例
人工智能·搜索引擎
有Li11 分钟前
跨视角差异-依赖网络用于体积医学图像分割|文献速递-生成式模型与transformer在医学影像中的应用
人工智能·计算机视觉
Json_1817901448012 分钟前
电商拍立淘按图搜索API接口系列,文档说明参考
前端·数据库
新加坡内哥谈技术31 分钟前
Mistral推出“Le Chat”,对标ChatGPT
人工智能·chatgpt
风尚云网35 分钟前
风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计
前端·css·学习·html·html5·风尚云网
木子020438 分钟前
前端VUE项目启动方式
前端·javascript·vue.js
GOTXX39 分钟前
基于Opencv的图像处理软件
图像处理·人工智能·深度学习·opencv·卷积神经网络
GISer_Jing40 分钟前
React核心功能详解(一)
前端·react.js·前端框架
捂月43 分钟前
Spring Boot 深度解析:快速构建高效、现代化的 Web 应用程序
前端·spring boot·后端