reactjs - React-hook-form 使用重置选择下拉值

标签 reactjs react-hooks next.js react-hook-form

我正在努力以更新位置的形式更新详细信息。 我需要在表单字段中显示现有值。

下面是更新组件的代码:

import axios from 'axios'
import { useState, useEffect } from 'react'
import { useForm } from 'react-hook-form'

export default function Edit({...props}) {
  const {
    register,
    handleSubmit,
    setValue,
    reset,
    formState: { errors },
  } = useForm({mode: 'onBlur' });

   useEffect(() => {
    
    if (props.locationDetails) {
        console.log(props.locationDetails) 
        // in this console I can get { 'name' : 'name value',  'company' : 'UUID'}
        reset( props.locationDetails);
    }
   }, [reset])

   const editLocation = async(data) => {
       .....
   }

   return (
     <form className="g-3" onSubmit={handleSubmit(editLocation)} data-testid="editLocationForm">

        <input type="text" {...register('name', { required: true })} className="form-control"  placeholder="Enter Name Here" />
                                                    {errors.name && <p className="error" role="error" >Name is required.</p>}

        <select {...register('company', { required: true })} 
                className="form-control" >
                {props.companies && props.companies.map((company, index) => {
                <option key={index} value={company.UUID}>{company.name}</option>
                }
                )}
        </select>
       
        .....
     </form>
   )

}



   export async function getServerSideProps({ params }) {

    if(params.id) {
        let locationId = params.id

        let locationResponse = await axios(process.env.BASE_URL + '/locations/' + locationId,{
            headers : {
                'Content-Type': 'application/json',
                'Authorization' : 'Bearer ' + process.env.TOKEN
            }
        })

        let companiesResponse = await axios(process.env.BASE_URL + '/companies',{
            headers : {
                'Content-Type': 'application/json',
                'Authorization' : 'Bearer ' + process.env.TOKEN
            }
        })

        if(locationResponse.status == 200 && locationResponse.data && companiesResponse.status == 200) {
            
            let locationDetails = await locationResponse.data

            let companies = await companiesResponse.data.results

            locationDetails.company = locationDetails.links.Company

            return {
                props : {
                    locationDetails: locationDetails,
                    companies: companies
                }
            }
        } else {
            return {
                props : {
                    locationDetails: {},
                    locationDetails:{}
                }
            }
        }    
    } else {
        return {
            props : {
                locationDetails: {},
                locationDetails:{}
            }
        }

    }
}

在这里,我可以在输入文本字段中设置位置的所有现有值,但无法显示选定的下拉列表。

响应结构如下:

{
   "name": "New York",
   "country": "USA",
   "company": "UUID"   <<<< this is the uuid which needs to be selected on select dropdown.
}

最佳答案

对于嵌套字段,在属性之间添加点:

<select {...register("links.company", { required: true })}>
  {(companies || []).map((company, index) => (
    <option key={index} value={company.UUID}>
      {company.name}
    </option>
  ))}
</select>

Codesandbox Demo

关于reactjs - React-hook-form 使用重置选择下拉值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69712300/

相关文章:

javascript - 为什么 react 会抛出 "Too many re-renders.",如果我们尝试更改 On Click 函数本身的状态

reactjs - 使用 useEffect 与使用 useCallback 处理 API 调用

javascript - Firebase V9 addDoc 未返回成功或失败或写入数据库

reactjs - 元素 : You cannot change the `stripe` prop after setting it 上不支持的 Prop 更改

reactjs - 管理 React 中多个下拉菜单的状态(语义 UI)

reactjs - 在对话框 Material ui 上 react 滚动

javascript - 为什么这个数组中的值(显然)立即改变

next.js - 在 NextJS 项目中使用 tw 元素

arrays - react this.setState 不更新数组状态变量

reactjs - React : Why on . 映射数组不显示项目列表?