使用React(飞冰ice.js)实现一个简单的待办事项列表 | 豆包MarsCode AI 刷题

341 阅读3分钟

图片.png

飞冰是一个由alibaba开源的基于 React 的应用研发框架,开箱即用,同时支持移动端和桌面端

接下来让我们尝试使用它实现一个简单的待办事项列表,功能包括:

  • 添加待办事项
  • 编辑待办事项
  • 删除待办事项

飞冰默认的React版本是React18,由于它特点之一是支持SSR,并且在路由设计上也是通过文件结构规定路由,与Nextjs非常相似,现在让我们正式开始

首先是创建ice项目,终端执行:

$ npm create ice ice-todo

图片.png

其中ice-todo是本次项目的名称,我们以默认模板Web Lite Scaffold创建项目

完成后cd进入项目文件夹,然后是常规的pnpm i,安装完毕之后pnpm start启动项目看一看

图片.png

启动之后页面非常简洁,样子如上

我们打开代码看一下

package.json中,start实际上调用了ice这个打包工具,符合ice官网所说开箱即用的特性

"scripts": {
  "start": "ice start --speedup",
  "build": "ice build",
  "eslint": "eslint ./src --cache --ext .js,.jsx,.ts,.tsx",
  "eslint:fix": "npm run eslint -- --fix",
  "stylelint": "stylelint "src/**/*.{css,scss,less}" --cache",
  "stylelint:fix": "npm run stylelint -- --fix"
}

在README.md中也可以看到ice对默认项目结构的解释

.
├── README.md
├── ice.config.mts                  # The project config.
├── package.json
├── .browserslistrc                 # Browsers that support.
├── public                          # Static files.
├── src                             # Application source code.
│   ├── app.ts                      # The app entry.
│   ├── assets                      # Assets directory.
│   ├── document.tsx                # The document entry.
│   ├── components                  # Components directory.
│   ├── pages                       # Pages directory.
│   │   ├── index.module.css        # Index page style.
│   │   └── index.tsx               # Index page component.
│   └── typings.d.ts                # The type definition.
└── tsconfig.json

项目默认的入口是app.ts,ice的设计允许工程师自行修改config以设定项目入口

在默认模板下,首页反映的是index.tsx里面的内容,值得注意的是,默认模板提供的是语义化的HTML,这点非常方便

图片.png

现在让我们在index.tsx里面写一个待办事项列表,首先从HTML开始

图片.png

我们把todolist写成一个列表,我们希望实现的效果如下

图片.png

当用户点击添加或者编辑,采用弹出对话框的方式进行输入和编辑

图片.png

代码的编写思路是:本质上,我们的组件要维护一个待办事项列表todos,添加相当于todos加多一项,编辑相当于更新todos,删除也很容易理解

首先考虑一个用户可能会点击多个按钮的问题,在这里我们采用弹框的方式使用z-index在物理层面上杜绝这种可能性

思路有了之后,我们首先去写对话框,添加对话框和编辑对话框的主要区别是onSubmit逻辑不一样,

添加是直接新建一个todo再更新todos

图片.png

编辑则是重写一个todo再更新todos

图片.png

编辑框本身的onSubmit并不做事情,一切都靠传入的handle函数

图片.png

主要代码大致如此

1.一些状态定义 图片.png

2.html结构 图片.png

其实写css会更麻烦一些

此外,对于ice.js框架来说,它在打包时对css的处理有一些问题

导致了input的width会超出预期长度

这一点或许要等待更正