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

相关推荐
Tony聊跨境15 分钟前
独立站SEO类型及优化:来检查这些方面你有没有落下
网络·人工智能·tcp/ip·ip
懒惰才能让科技进步21 分钟前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
Qspace丨轻空间31 分钟前
气膜场馆:推动体育文化旅游创新发展的关键力量—轻空间
大数据·人工智能·安全·生活·娱乐
没有不重的名么33 分钟前
门控循环单元GRU
人工智能·深度学习·gru
love_and_hope36 分钟前
Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
人工智能·pytorch·python·深度学习·学习
栈老师不回家1 小时前
Vue 计算属性和监听器
前端·javascript·vue.js
2403_875736871 小时前
道品科技智慧农业中的自动气象检测站
网络·人工智能·智慧城市
前端啊龙1 小时前
用vue3封装丶高仿element-plus里面的日期联级选择器,日期选择器
前端·javascript·vue.js
一颗松鼠1 小时前
JavaScript 闭包是什么?简单到看完就理解!
开发语言·前端·javascript·ecmascript
学术头条1 小时前
AI 的「phone use」竟是这样练成的,清华、智谱团队发布 AutoGLM 技术报告
人工智能·科技·深度学习·语言模型