最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Antd 4.0.0: How to use form.getFieldValue() and all form's APIs by `const [form] = Form.useForm`? - Stack O

programmeradmin3浏览0评论

I run React with Ant Design and am getting this error:

Instance created by 'useForm' is not connect to any Form element. Forget to pass 'form' prop?

Code:

// .../services/index.js
export { default as registerService } from './registerService'


// .../services/registerService.js
import axios from '../../../configs/api.service'

const registerService = (form) => {
  return {
    validatePasswordAndConfirmPassword: async (rule, value) => {
      if (value && value !== form.getFieldValue(['user', 'confirmPassword'])) {
        throw new Error('Password and Confirm Password must be same')
      }
    },

    register: async user => {
      const { data } = await axios.post('/users', user)
      const { _id, username } = data
      console.log('Register Success:', `User ${username} is created, You get ID: ${_id}`)
      return data
    },
  }
}

export default registerService

// Register Component
import React from 'react'
import { Button, Form, Input } from 'antd'
import { registerService } from '../../services/'

const Register = () => {
  const [form] = Form.useForm()
  const service = registerService(form)

  const onFinish = async ({ user }) => {
    try {
      await service.register(user)
    } catch (err) {
      console.error('Register Failed:', err.response)
    }
  }

  const onFinishFailed = errorInfo => {
    console.error('Failed:', errorInfo)
  }

  return (
    <>
      <Form {...layout}
            name="Register"
            onFinish={onFinish}
            onFinishFailed={onFinishFailed}
            validateMessages={validateMessages}
      >
        <Form.Item
          name={['user', 'username']}
          label="Username"
          rules={[
            { required: true },
          ]}
        >
          <Input />
        </Form.Item>
        <Form.Item
          name={['user', 'password']}
          label="Password"
          rules={[
            { required: true },
            { validator: service.validatePasswordAndConfirmPassword },
          ]}
        >
          <Input.Password />
        </Form.Item>
        <Form.Item
          name={['user', 'confirmPassword']}
          label="Confirm Password"
          rules={[
            { required: true },
            {/*{ validator: service.validatePasswordAndConfirmPassword },*/}
          ]}
        >
          <Input.Password />
        </Form.Item>
        <Form.Item {...tailLayout}>
          <Button type="primary" htmlType="submit">Submit</Button>
        </Form.Item>
      </Form>
    </>
  )
}

export default Register

how can I fix this bug?

I run React with Ant Design and am getting this error:

Instance created by 'useForm' is not connect to any Form element. Forget to pass 'form' prop?

Code:

// .../services/index.js
export { default as registerService } from './registerService'


// .../services/registerService.js
import axios from '../../../configs/api.service'

const registerService = (form) => {
  return {
    validatePasswordAndConfirmPassword: async (rule, value) => {
      if (value && value !== form.getFieldValue(['user', 'confirmPassword'])) {
        throw new Error('Password and Confirm Password must be same')
      }
    },

    register: async user => {
      const { data } = await axios.post('/users', user)
      const { _id, username } = data
      console.log('Register Success:', `User ${username} is created, You get ID: ${_id}`)
      return data
    },
  }
}

export default registerService

// Register Component
import React from 'react'
import { Button, Form, Input } from 'antd'
import { registerService } from '../../services/'

const Register = () => {
  const [form] = Form.useForm()
  const service = registerService(form)

  const onFinish = async ({ user }) => {
    try {
      await service.register(user)
    } catch (err) {
      console.error('Register Failed:', err.response)
    }
  }

  const onFinishFailed = errorInfo => {
    console.error('Failed:', errorInfo)
  }

  return (
    <>
      <Form {...layout}
            name="Register"
            onFinish={onFinish}
            onFinishFailed={onFinishFailed}
            validateMessages={validateMessages}
      >
        <Form.Item
          name={['user', 'username']}
          label="Username"
          rules={[
            { required: true },
          ]}
        >
          <Input />
        </Form.Item>
        <Form.Item
          name={['user', 'password']}
          label="Password"
          rules={[
            { required: true },
            { validator: service.validatePasswordAndConfirmPassword },
          ]}
        >
          <Input.Password />
        </Form.Item>
        <Form.Item
          name={['user', 'confirmPassword']}
          label="Confirm Password"
          rules={[
            { required: true },
            {/*{ validator: service.validatePasswordAndConfirmPassword },*/}
          ]}
        >
          <Input.Password />
        </Form.Item>
        <Form.Item {...tailLayout}>
          <Button type="primary" htmlType="submit">Submit</Button>
        </Form.Item>
      </Form>
    </>
  )
}

export default Register

how can I fix this bug?

Share Improve this question edited Jun 20, 2020 at 9:12 CommunityBot 11 silver badge asked Feb 29, 2020 at 11:29 fResultfResult 4973 gold badges5 silver badges17 bronze badges 1
  • could you make a code sandbox ? – blueseal Commented Feb 29, 2020 at 15:22
Add a comment  | 

1 Answer 1

Reset to default 14

Okay... I fixed it already

I just pass property form={form} into Form component. Like line 4

const [form] = Form.useForm()

<Form {...layout}
      form={form}
      name="Register"
      onFinish={onFinish}
      onFinishFailed={onFinishFailed}
      validateMessages={validateMessages}
>
        <Form.Item
          name={['user', 'username']}
          label="Username"
          rules={[
            { required: true },
          ]}
        >
          <Input />
        </Form.Item>
        <Form.Item
          name={['user', 'password']}
          label="Password"
          rules={[
            { required: true },
            { validator: service.validatePasswordAndConfirmPassword },
          ]}
        >
          <Input.Password />
        </Form.Item>
        <Form.Item
          name={['user', 'confirmPassword']}
          label="Confirm Password"
          rules={[
            { required: true },
            { validator: service.validatePasswordAndConfirmPassword },
          ]}
        >
          <Input.Password />
        </Form.Item>
        <Form.Item {...tailLayout}>
          <Button type="primary" htmlType="submit">Submit</Button>
        </Form.Item>
</Form>
发布评论

评论列表(0)

  1. 暂无评论