首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >antd Form.Item只接受一个孩子

antd Form.Item只接受一个孩子
EN

Stack Overflow用户
提问于 2022-02-24 13:54:53
回答 2查看 768关注 0票数 1

我创建了一个小Fiddle来说明这个问题:https://stackblitz.com/edit/react-avejvc-mmhqda?file=index.js

此表格适用于:

代码语言:javascript
运行
复制
      <Form initialValues={{ surname: 'Mouse'}}>
        <Form.Item name="surname">
          <Input />
        </Form.Item>
      </Form>

此表格不包括:

代码语言:javascript
运行
复制
      <Form initialValues={{ surname: 'Mouse'}}>
        <Form.Item name="surname">
          <Input />
          {null}
        </Form.Item>
      </Form>

唯一的区别是,第二种形式的Form.Item有两个子级。

这背后有什么意图吗?

万一有人想知道我为什么要问。所以像这样的东西打破了形式:

代码语言:javascript
运行
复制
<Form.Item name={name}>
  {type==="string" && <Input />}
  {type==="integer" && <InputNumber />}
</Form.Item>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-09 10:44:58

我找到了解决办法,现在对正在发生的事情有了更好的了解。

来自docs (https://ant.design/components/form/#Form.Item):

在用名称属性包装Form.Item之后,onChange(或触发器定义的其他属性)onChange将添加到窗体控件中,表单数据流将由表单处理。

在文档中也有一个工作示例,下面是codepen:https://codepen.io/pen?&editors=001

代码语言:javascript
运行
复制
const {  useState  } = React;;
const {  Form, Input, Select, Button  } = antd;
const { Option } = Select;

const PriceInput = ({ value = {}, onChange }) => {
  const [number, setNumber] = useState(0);
  const [currency, setCurrency] = useState('rmb');

  const triggerChange = (changedValue) => {
    onChange?.({
      number,
      currency,
      ...value,
      ...changedValue,
    });
  };

  const onNumberChange = (e) => {
    const newNumber = parseInt(e.target.value || '0', 10);

    if (Number.isNaN(number)) {
      return;
    }

    if (!('number' in value)) {
      setNumber(newNumber);
    }

    triggerChange({
      number: newNumber,
    });
  };

  const onCurrencyChange = (newCurrency) => {
    if (!('currency' in value)) {
      setCurrency(newCurrency);
    }

    triggerChange({
      currency: newCurrency,
    });
  };

  return (
    <span>
      <Input
        type="text"
        value={value.number || number}
        onChange={onNumberChange}
        style={{
          width: 100,
        }}
      />
      <Select
        value={value.currency || currency}
        style={{
          width: 80,
          margin: '0 8px',
        }}
        onChange={onCurrencyChange}
      >
        <Option value="rmb">RMB</Option>
        <Option value="dollar">Dollar</Option>
      </Select>
    </span>
  );
};

const Demo = () => {
  const onFinish = (values) => {
    console.log('Received values from form: ', values);
  };

  const checkPrice = (_, value) => {
    if (value.number > 0) {
      return Promise.resolve();
    }

    return Promise.reject(new Error('Price must be greater than zero!'));
  };

  return (
    <Form
      name="customized_form_controls"
      layout="inline"
      onFinish={onFinish}
      initialValues={{
        price: {
          number: 0,
          currency: 'rmb',
        },
      }}
    >
      <Form.Item
        name="price"
        label="Price"
        rules={[
          {
            validator: checkPrice,
          },
        ]}
      >
        <PriceInput />
      </Form.Item>
      <Form.Item>
        <Button type="primary" htmlType="submit">
          Submit
        </Button>
      </Form.Item>
    </Form>
  );
};

ReactDOM.render(<Demo />, mountNode);
票数 1
EN

Stack Overflow用户

发布于 2022-02-24 14:34:05

官方文档这里给出了在一个Form.Item中使用多个子文档的示例。

代码语言:javascript
运行
复制
<Form.Item label="Field">
    <Form.Item name="field" noStyle><Input /></Form.Item> // that will bind input
    <span>description</span>
</Form.Item>

你似乎对你在Form.Item中所放的东西有问题。{null}是不允许的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71253087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档