示教器APP· 开发实践(二)

这周给外包项目添加了坐标系和工具箱的配置页面,主要提供两者的CRUD功能。

甲方提供了坐标系和工具箱的接口。每一个坐标系或者工具箱都包含了名称和id以及一系列点,其中坐标系包含3个点,坐标系包含6个点。而每个点则具有12个属性。

甲方要求坐标系和工具箱分开进行配置,并且放在之前的安全界面。

经过和美工组同学的讨论之后,他们很快设计好了UI,交由我来制作。

这个业务最大的特点就是表单庞大,需要提交的内容很多。

但其实很明显,坐标系和工具箱之间有很多逻辑是可以复用的。

于是我构建了两个组件,一个是PointGroup,一个是 CoordinateControl

PointGroup 组件

该组件的功能就是提供某个点的配置功能,含有12个input。

该组件接收2个属性,分别代表点的类型和序号.

1
2
3
4
interface PointGroupProps {
type: number;
index: number;
}

其中type表示坐标系还是工具箱,index则表示点的序号。

关于Input的value和placeholder

这一点在之前我从来没有特意关注过,可能是因为之前的输入框主要是输入字符串。这次我们的输入框的内容都是数字。我最开始为每个输入框的value定义了类型是number的state。state的初始值设为0.此时我发现input的placeholder失效了。并且输入的时候没有办法将0删除并重新输入。

通过查阅资料,我发现input的value最好设定为string类型,然后在onchange事件中进行非法字符的判断。只有这样才不影响用户的输入体验。

CoordinateControl 组件

该组件提供了对于坐标系或者工具箱的name和point的管理功能。

接收一个属性:type,用来区分其是坐标系还是工具箱。

该组件首先使用一个下拉菜单来呈现当前数据库中所有的坐标系。并且在这个下拉菜单中提供增加坐标系的功能。

在该功能的实现上,我起初考虑了Antd rn 的Selector组件,但是在阅读文档之后,感觉其定制能力较弱。考虑再三后选择了比较熟悉的 ElementUI 的Tooltip组件。

组件下方提供了3或者6个按钮,以方便用户选择切换点。

通过Redux来实现复用

由于工具箱和坐标系是可以同时编辑的,因此我们要分别对其进行状态的维护与管理。其内部的管理大同小异,我们以坐标系为例。

坐标系包括了3个点,每个点的状态都要进行保存。

同时我们UI中有个小功能是,当用户配置完某个点时,controller中对应的按钮要变色。

因此我们设定了每个点的check flag

这样,我们用户编辑完一个点之后,需要点击PointGroup的保存按钮来保存该点的状态。此时我们对输入进行合法性检验,检验完毕之后,dispatch到store之中。并且对check flag属性也进行变更。

总结

在实现这个功能之后,我觉得我们在拿到一个业务之后,不要急于下手去干,而是要仔细分析,先在脑海里有一个大体的程序结构,再去把它们实现。

正是因为有了架构,在这次开发中我才没有犯很大的错误,功能的实现进行的比较顺利。