Ant Design

Layout

页面级整体布局。

主题

Ant design 将影响主题的最小元素称之为Design Token,如colorText, fontSize等。

  • 组件中使用当前主题下的 design token
import { theme } from 'antd';
const { useToken } = theme;

const PasswordSet = () => {
  const { token } = useToken();
  return <div>{token.colorText}</div>;
};
  • 静态消费
import { theme } from 'antd';
const { getDesignToken } = theme;
const token = getDesignToken();
console.log(token.colorText);

Descriptions

  • span 占据几列

Card

Tabs

Table

用于展示行列数据。

  • 筛选:filters=[{value,text}]设置筛选项,onFilter触发筛选时会逐个调用onFilter函数,其一满足后续就不再调用了,如名字中带有名或明的人,filterMultiple 默认为true。
  • 排序:defaultSortOrder, sorter
  • 固定列:scroll:x即table最小宽度为x。父容器大于x,则table宽度等于父容器宽度,否则table宽度等于x。
    指定width 会优先压缩可压缩单元格。
.ant-table-content{
  overflow:"auto"
}
table{
  min-width:"100%";
  width:1000px; (x)
}

Modal

  • 异步关闭:confirmLoading=== true显示loading,否则不显示。
  • 确定按钮:onOk 点击确定回调 function(e)

Form

  • 初始值:Form initialValues

  • 校验规则:Item rules,多个规则:rules={[{ required: true }, formNameRule]}

  • 输入回车自动执行 onFinish

  • 必须配合Form.Item使用,否则收集不到数据

  • <Form.Item name="name" noStyle>,不添加额外的dom节点,仅为表单添加name\lable\rules

  • 表单数据域发生变化会根据规则校验

  • 表单可以嵌入其它元素

<Form>
        <p>not form item</p>
        <Form.Item name="name">
          <Input />
        </Form.Item>
      </Form>
  • form css 结构
form 
  - .ant-form-item 
    - .ant-row
      - .ant-col
        - label
      - .ant-col
        - .ant-form-item-control-input
  • Form.Item 用于表单组件布局(labelCol,wrapperCol)、校验(rules)、双向绑定(name)
    Item可以被包裹\嵌套如:
    <Form>
      <div>
        <div>
          <Form.Item>xxx</Form.Item>
        </div>
      </div>
    </Form>

    <Form.Item label="Username" name="xx">
      <Space>
        <Form.Item
          name="username"
          noStyle
          rules={[{ required: true, message: 'Username is required' }]}
        >
          <Input style={{ width: 160 }} placeholder="Please input" />
        </Form.Item>
        <Tooltip title="Useful information">
          <Typography.Link href="#API">Need Help?</Typography.Link>
        </Tooltip>
      </Space>
    </Form.Item>

Form.Item 嵌套子组件后,不更新表单值,可以通过 HOC 自定义组件形式来解决这个问题

  • 表单布局:layout='inline'
form (flex)
  - .ant-form-item (margin-inline-end:16)
    - .ant-col
      - label
    - .ant-col
      - .ant-form-item-control-input (input 默认有个宽度,select 默认宽度包裹内容,可指定width)
  • 嵌套结构
<Form.Item
      name={['user', 'name']}
      label="Name"
      rules={[{ required: true }]}
    >
      <Input />
    </Form.Item>

表单值 values.user.name

  • 动态增减表单项 Form.List 封装了增删逻辑,renderProps自定义表单。
  • 校验与更新依赖,当依赖项变化时会触发校验与更新
  • 表单项的值,直接设置是无效的
// 无效
      <Form.Item label="Password" name="password" rules={[{ required: true }]}>
        <Input value={'xxx'} />
      </Form.Item>
  • 动态表单与更新依赖综合应用
import { Button, Form, Input } from 'antd';
const { useForm } = Form;
const Test = () => {
  const [form] = useForm();
  return (
    <Form form={form} onFinish={(values) => console.log(values)}>
      <Form.List name="names">
        {(fields, { add }) => {
          return (
            <>
              {fields.map(({ key, name, ...rest }) => (
                <div key={key}>
                  <Form.Item name={[name, 'rate']} {...rest}>
                    <Input
                      onChange={(e) =>
                        form.setFieldValue(
                          ['names', name, 'price'],
                          e.target.value,
                        )
                      }
                    />
                  </Form.Item>
                  <Form.Item dependencies={[['names', name, 'rate']]}>
                    {() => {
                      return (
                        <div>
                          23
                          <Form.Item name={[name, 'price']} {...rest}>
                            <Input />
                          </Form.Item>
                        </div>
                      );
                    }}
                  </Form.Item>
                </div>
              ))}
              <Button onClick={() => add()}>add</Button>
            </>
          );
        }}
      </Form.List>
      <Form.Item>
        <Button htmlType="submit">submit</Button>
      </Form.Item>
    </Form>
  );
};

export default Test;

Select

  • optionRender: 自定义渲染下拉项
  • 布局:默认宽度包裹内容,可指定width

Input

  • 布局:width:100%,原生input 有个默认宽度。
.ant-input{
    display: inline-block;
    width: 100%;
}

FAQ

  • Input 未输入任何值返回 undefined 还是 null?
    Q: 未输入返回undefined, 输入后返回 '',初始值是 null 或 undefined 都不显示。
  • less 如何消费 Design Token
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355

推荐阅读更多精彩内容