论如何搭上 antd 的快车-Form 篇

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 论如何搭上 antd 的快车-Form 篇

有些人写的文章叫做教程

有些人写的文章叫做科普

而我写的文章多半是篇水贴


当然如果你的项目中允许你直接使用 antd 的组件,那是很舒服,无论是 3.0 的Form.create()或者 4.0 的no create ,额,好吧,我可能是一个比较遵循官方写法的简单用户,我就从来没有发现Form有什么问题。你知道的,懒得去看 issues 和文档的伸手党,发现 bug 都会当做是新特性的。


由于我们项目中使用的是 umi ,它内置了 antd 和 antd-mobile 并且都配置了按需加载,我们 UI 在设计的时候,有时候(几乎)会参考 antd 的官网,也有几个用上了高级的 kitchen,所以很多前端同事,也会偷偷的在 mobile 项目中使用 antd 的组件,这种事情,我都是当作没看到的。反正他们乐意重写一遍样式也没多大问题。


言归正传

image.png

那我就想 antd@4 的 From 能不能直接用到 mobile 里面。

import { Form } from 'antd'; // 4.0.0-rc.1
import { InputItem, Button } from 'antd-mobile';
const [form] = Form.useForm();
return (
    <Form
      form={form}
      name="basic"
      initialValues={{ username: 'xiaohuoni' }}
      onFinish={onFinish}
      onFinishFailed={onFinishFailed}
    >
      <List>
        <Form.Item
          name="username"
          rules={[{ required: true, message: 'Please input your username!' }]}
        >
          <InputItem>Username</InputItem>
        </Form.Item>
        <Form.Item
          name="password"
          rules={[{ required: true, message: 'Please input your password!' }]}
        >
          <InputItem>Password</InputItem>
        </Form.Item>
        <Form.Item {...tailLayout}>
          <Button type="primary" onClick={() => form.submit()}>
            Submit
          </Button>
        </Form.Item>
      </List>
    </Form>
)

image.png

竟然可以用,通过 umi-plugin-cordova 打包成了 app,在不同的设备上测试了兼容性。目前没发现什么问题(以我看不到 bug 的眼睛)。就是这个错误提示,不太像是移动端的,后面再随便改改。


rc-form

import { InputItem } from 'antd-mobile';
import React, { FC } from 'react';
import { createForm, formShape } from 'rc-form';
interface PageProps {
  form: formShape; 
}
const Page:FC<PageProps> = () => {
  const { form } = this.props;
  const { getFieldProps } = form;
  return (
    <List>
      <InputItem
        {...getFieldProps('username', {
          initialValue:'xiaohuoni',
          rules: [{ required: true, message: 'Please input your username!' }],
        })}
      >
        title
      </InputItem>
    </List>
  );
};
export default createForm()(Page);


rc-field-form

import { InputItem } from 'antd-mobile';
import React, { FC } from 'react';
import Form, { Field, useForm } from 'rc-field-form';
const Page: FC = () => {
  const [form] = useForm();
  return (
    <Form form={form} name="basic" initialValues={{ username: 'xiaohuoni' }}>
      <Field
        name="username"
        rules={[{ required: true, message: 'Please input your username!' }]}
      >
        <InputItem>Username</InputItem>
      </Field>
    </Form>
  );
};
export default Page;

(其实和直接使用antd@4 的 Form 差不多,直接用 Field 替换 Form.Item 就好)

嗯,还是挺完美的。


remax

上次See Conf 的时候,  边柳在【技术专场】使用 React 开发小程序 中有提到, rc-field-form可以直接在 remax 上使用。回来自己试了一下,是这样子的。

import * as React from 'react';
import { View, Text, Image, Input, Button } from 'remax/wechat';
import Form, { Field, useForm } from 'rc-field-form';
import styles from './index.module.css';
export default () => {
  const [form] = useForm();
  const onFinish = values => {
    console.log('Success:', values);
  };
  const onFinishFailed = errorInfo => {
    console.log('Failed:', errorInfo);
  };
  return (
    <View className={styles.app}>
      <View className={styles.header}>
        <Form
          form={form}
          name="basic"
          initialValues={{ username: 'ssad' }}
          onFinish={onFinish}
          onFinishFailed={onFinishFailed}
        >
          <Field
            name="username"
            rules={[{ required: true, message: 'Please input your username!' }]}
          >
            <Input />
          </Field>
          <Button onClick={() => form.submit()}>提交</Button>
        </Form>
      </View>
    </View>
  );
};

image.png

(此处应该有表情包)

带着疑问,把 remax 的文档找了一遍,都没有看到关于这一部分的说明,最后请教了边柳,才知道是在 react-component/field-form ,我的眼睛不止看不到 bug ,现在还看不到文档。

image.png

修改一下我的代码,加上了 component={false} ,终于跑通了阿。

image.png

然后,这次细心的我发现了一个问题,我在代码里面写了 initialValues={{ username: 'ssad' }} 为什么没有绑定上???对于好几年没写小程序的人来说,敲下的每一个字母都是在怀疑自己。

接着问大佬吧,给看了我的代码,嗯,大佬也觉得没什么问题,然后大佬偷偷告诉了我一个秘密。


“陈帅写的”。

和陈帅详细的比对了我俩的代码。没发现任何异常。然后我就怀疑是豆酱 "偷偷的在代码里面下毒"。然后我就在这三个男人之间,辗转反则(这词用的不太对)。

最后发现是在支付宝小程序上可以正确运行,而在微信小程序上不行。提一个bug [问题]使用 rc-field-form 在微信小程序上,无法绑定组件 https://github.com/remaxjs/remax/issues/589

然后在短短的四分钟之后,就被解答了。

image.png


React Native

其实跑通了remax,照着写rn的实现就可以了。需要注意的几点(其实在remax里面也一样,放到这里写,是因为上面都说了,这里就没得写了)。


Form 要设置 component={false}

Field 要根据组件响应的函数,设置 trigger="onInput",比如 remax 中设置的是trigger="onInput"  ,React Native 中设置的是 trigger="onChangeText" ,如果你有使用其他的第三方组件库,可以留意一下表单组件的onChange 应该被正确替换成什么。

最终版本的RN 代码 如下

<Form
      form={form}
      component={false}
      name="basic"
      initialValues={{ username: '我是猪' }}
      onFinish={onFinish}
      onFinishFailed={onFinishFailed}
    >
      <Field
        name="username"
        rules={[{ required: true, message: 'Please input your username!' }]}
        trigger="onChangeText"
      >
        <TextInput></TextInput>
      </Field>
      <Button onPress={() => form.submit()}>提交</Button>
    </Form>

image.png

终于知道为什么我去年写的少了,3分钟写文章,30分钟找 bug,300分钟改 bug,Over!!

然后 rc-field-form 是一个跨平台组件,真香。

image.png

总结:嗯,总要写点总结的嘛,谁说水贴就不配有总结的。圆规请再转一次。其实现在我应该吃完午饭在午休才对的,嗯,饮水机的水免费的啊,真香。

(特别鸣谢:边柳、豆酱、期贤、16宇友情出演)

相关实践学习
【AI破次元壁合照】少年白马醉春风,函数计算一键部署AI绘画平台
本次实验基于阿里云函数计算产品能力开发AI绘画平台,可让您实现“破次元壁”与角色合照,为角色换背景效果,用AI绘图技术绘出属于自己的少年江湖。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
目录
相关文章
Next.js 实战 (三):优雅的实现暗黑主题模式
这篇文章介绍了在Next.js中实现暗黑模式的具体步骤。首先,需要安装next-themes库。然后,在/components/ThemeProvider/index.tsx文件中新增ThemeProvider组件,并在/app/layout.tsx文件中注入该组件。如果想要加入过渡动画,可以修改代码实现主题切换时的动画效果。最后,需要在需要的位置引入ThemeModeButton组件,实现暗黑模式的切换。
329 0
Next.js 实战 (三):优雅的实现暗黑主题模式
|
JSON 前端开发 JavaScript
前端使用lottie-web,使用AE导出的JSON动画贴心教程
前端使用lottie-web,使用AE导出的JSON动画贴心教程
1593 2
|
12月前
|
消息中间件 架构师 Java
阿里面试:秒杀的分布式事务, 是如何设计的?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试阿里、滴滴、极兔等一线互联网企业时,遇到了许多关于分布式事务的重要面试题。为了帮助大家更好地应对这些面试题,尼恩进行了系统化的梳理,详细介绍了Seata和RocketMQ事务消息的结合,以及如何实现强弱结合型事务。文章还提供了分布式事务的标准面试答案,并推荐了《尼恩Java面试宝典PDF》等资源,帮助大家在面试中脱颖而出。
|
SQL 自然语言处理 关系型数据库
MySQL的match匹配多个字符串的语法
【8月更文挑战第29天】MySQL的match匹配多个字符串的语法
563 3
|
关系型数据库 MySQL
启动mysql时报错"/etc/init.d/mysqld: Permission denied"
请谨慎操作,并根据你的具体情况选择适当的解决方法。如果问题仍然存在,你可能需要查看MySQL的文档或寻求进一步的支持。
859 1
|
弹性计算 Linux 网络安全
阿里云ECS云服务器如何开放8080端口?
阿里云服务器ECS处于安全考虑默认自带安全组(仅开放了22号和3389号端口),Tomcat的默认端口号为8080,所以想使用Tomcat不开放8080端口是不行的。很多用户通过修改iptables来开放8080号端口,结果失败,这是由于安全组,对安全组,阿里云亘古不变的安全组开放端口问题。
56845 1
|
前端开发 容器
css——图片缩放,拉伸,变形的解决办法
css——图片缩放,拉伸,变形的解决办法
1253 0
|
Java Android开发 开发工具
【Android错误集锦】 "程序包R不存在" 的解决方法
新建一个Android项目,修改资源、包名等多种信息后,报『错误: 程序包R不存在』的错误。 意译为:『您引用的R可能与包名不符,非包名路径下的文件可能需要写明 “import 包名.R”。请在查验包名正确后重试』。
19053 0
|
Web App开发 安全 Android开发
接口测试之Fiddler+APP抓包
Fiddler简介: Fiddler是强大且好用的Web调试工具之一,它能记录客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数 据。
3216 0
|
Android开发 开发者 开发工具
3.2、Android Studio在物理设备中运行APP
当你构建一个Android应用时,在发布给用户之前,在物理设备上测试一下你的应用是非常必要的。
1296 0