Ant Design Cascader 交互场景

何时使用

  • 需要从一组相关联的数据集合进行选择,例如省市区,公司层级,事物分类等。
  • 从一个较大的数据集合中进行选择时,用多级分类进行分隔,方便选择。
  • 比起 Select 组件,可以在同一个浮层中完成选择,有较好的体验。

业务场景

提交选择器子选项,多选场景下用约定分割符分割,以字符串形式提交到后端,编辑时回显数据。

如何展示子项

showCheckedStrategy={Cascader.SHOW_CHILD}
<Cascader
   multiple
   options={option}
   placeholder="请选择省市"
   showCheckedStrategy={Cascader.SHOW_CHILD}
/>

在这里插入图片描述

前后端交互

  const onFinish = (values) => {
    // 需要提交的数据格式(约定为字符串,多个用','分割)
    const area = _.isNil(values?.area)
      ? values?.area
      : values?.area.map(([parent, child]) => child).join(",");
    console.log(typeof area, area, "提交到后端数据");
  };

在这里插入图片描述

编辑时回显

提交数据时去掉了父级选项,回显时需要找回每个子元素的父级。

//  假设获取到后端数据
  const data = { area: "chengdu,mianyang" };
  
  const getData = (value: string): string[] =>
    option
      .map((parent) =>
        parent.children.map((child) => [parent.value, child.value])
      )
      .flat()
      .find((it) => _.last(it) === value);

  const displayData = data?.area
    .split(",")
    .map((item: string) => getData(item));

  form.setFieldsValue({
    area: displayData
  });
  console.log(displayData, "处理好的回显数据赋值给Form.Item回显");

在这里插入图片描述

完整代码

import React from "react";
import _ from "lodash";
import { Cascader, Form, Button } from "antd";
import "antd/dist/antd.css";
import "./index.css";

const CascaderComponent: React.FC = () => {
  const [form] = Form.useForm();

  const option = [
    {
      label: "四川",
      value: "siChuan",
      children: [
        {
          label: "成都",
          value: "chengdu"
        },
        {
          label: "绵阳",
          value: "mianyang"
        },
        {
          label: "德阳",
          value: "deyang"
        },
        {
          label: "眉山",
          value: "meishan"
        }
      ]
    },
    {
      label: "浙江省",
      value: "zhejiang",
      children: [
        {
          label: "杭州",
          value: "hangzhou"
        }
      ]
    }
  ];

  //  如何回显数据
  const data = { area: "chengdu,mianyang" };

  form.setFieldsValue({
    area: data.area
  });

  const getData = (value: string): string[] =>
    option
      .map((parent) =>
        parent.children.map((child) => [parent.value, child.value])
      )
      .flat()
      .find((it) => _.last(it) === value);

  const displayData = data?.area
    .split(",")
    .map((item: string) => getData(item));

  form.setFieldsValue({
    area: displayData
  });
  console.log(displayData, "处理好的回显数据赋值给Form.Item回显");

  const onFinish = (values) => {
    // 需要提交的数据格式(约定为字符串,多个用','分割)
    const area = _.isNil(values?.area)
      ? values?.area
      : values?.area.map(([parent, child]) => child).join(",");
    console.log(typeof area, area, "提交到后端数据");
  };

  return (
    <Form form={form} onFinish={onFinish} layout="vertical">
      <Form.Item
        label="省市"
        name="area"
        initialValue={[["siChuan", "chengdu"]]}
      >
        <Cascader
          multiple
          options={option}
          placeholder="请选择省市"
          showCheckedStrategy={Cascader.SHOW_CHILD}
        />
      </Form.Item>
      <Form.Item>
        <Button type="primary" htmlType="submit">
          Submit
        </Button>
      </Form.Item>
    </Form>
  );
};

export default CascaderComponent;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李 元 芳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值