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

相关推荐
前端小小王18 分钟前
React Hooks
前端·javascript·react.js
迷途小码农零零发28 分钟前
react中使用ResizeObserver来观察元素的size变化
前端·javascript·react.js
泰迪智能科技0134 分钟前
高校深度学习视觉应用平台产品介绍
人工智能·深度学习
娃哈哈哈哈呀1 小时前
vue中的css深度选择器v-deep 配合!important
前端·css·vue.js
盛派网络小助手1 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#
旭东怪1 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
Eric.Lee20211 小时前
Paddle OCR 中英文检测识别 - python 实现
人工智能·opencv·计算机视觉·ocr检测
cd_farsight2 小时前
nlp初学者怎么入门?需要学习哪些?
人工智能·自然语言处理
AI明说2 小时前
评估大语言模型在药物基因组学问答任务中的表现:PGxQA
人工智能·语言模型·自然语言处理·数智药师·数智药学
Focus_Liu2 小时前
NLP-UIE(Universal Information Extraction)
人工智能·自然语言处理