从子下拉菜单中获取价值

Getting Value from a Child Dropdown

我正在尝试使用函数 getValues 从我创建的子组件的 react-hook-form 中获取值(请记住,这是一个示例,并且有一些在此创建组件的逻辑时尚)。当我单击“打印值”时,它没有获得 authorId 的值。有什么想法吗?

这是两个组成部分:

const { register, control, getValues } = useForm();

<Button
  onClick={() => {
    console.log(getValues());
  }}
>
  Print Values
</Button>

<FormControl variant="outlined">
  <InputLabel>Author</InputLabel>
  <Controller
    {...register}
    control={control}
    name="authorId"
    render={({ field }) => (
      <CustomDropdown control={control} category="Author" field={field} />
    )}
  />
</FormControl>

CustomDropdown.js

const CustomDropdown = ({ field }) => {
  const [selectedValues, setSelectedValues] = React.useState("");

  <Select
    {...field}
    value={selectedValues || ""}
    onChange={(e) => {
      setSelectedValues(e.target.value);
    }}
  >
    return <MenuItem key="1" value="1">
      Option 1
    </MenuItem>
    <MenuItem key="2" value="2">
      Option 2
    </MenuItem>
  </Select>;
};

有几件事。首先,需要使用输入名称调用 register 方法。 在控制器组件中,您没有调用 register

<Controller
  {...register}

改为:

<Controller
  {...register("authorId")}

此外,您没有使用 useForm 挂钩来控制 CustomDropdown 组件的值。

相反,您正在使用 useForm 挂钩不知道的

自己的反应状态来控制该值
const [selectedValues, setSelectedValues] = React.useState("");
// ...
onChange={(e) => { setSelectedValues(e.target.value) }}

一种解决方案是将 setValue 方法和 value 作为属性传递给 CustomDropdown 组件。

第一个文件

const { register, control, getValues, setValue } = useForm();

const setAuthorIdValue = (value) => setValue("authorId", value);

<Button
  onClick={() => {
    console.log(getValues());
  }}
>
  Print Values
</Button>

<FormControl variant="outlined">
  <InputLabel>Author</InputLabel>
  <Controller
    {...register("authorId")}
    control={control}
    name="authorId"
    render={({ field }) => (
      <CustomDropdown
        control={control}
        category="Author"
        field={field}
        value={getValues("authorId")}
        setValue={setAuthorIdValue}
      />
    )}
  />
</FormControl>

CustomDropdown.js

const CustomDropdown = ({ field, value, setValue }) => {
  return <Select
    {...field}
    value={value || ""}
    onChange={(e) => {
      setValue(e.target.value);
    }}
  >
    return <MenuItem key="1" value="1">
      Option 1
    </MenuItem>
    <MenuItem key="2" value="2">
      Option 2
    </MenuItem>
  </Select>;
};

如果你只需要输出值你应该使用当前范围

const CustomDropdown = () => {
  const [selectedValues, setSelectedValues] = useState("value 1");
  return (
    <>
    <button onClick={()=>console.log(selectedValues)}> Get value </button>
    <select 
      value={selectedValues}
      onChange={e => setSelectedValues(e.target.value)}>
        <option value="value 1"> Value 1</option>
        <option value="value 2"> Value 2</option>
        <option value="value 3"> Value 3</option>
      </select>
    </>
  )
} 

如果您需要该值用于其他目的,请使用 the Context Hook

编辑: 使用上下文挂钩将值从子项传递到父项的示例。在您的情况下,您需要像这样在 App.js 中定义 useState

App.js

import { createContext, useState } from 'react';
import './App.css';
import Child from './Child.js'

export const MyContext = createContext("N0thing")

function App() {
  const [getValue, changeValue] = useState(0)
  return (
    <div className="App">
      <header className="App-header">
      <MyContext.Provider value={{getValue, changeValue}}>
          <Child/>
      </MyContext.Provider>
          Renderd by Parent {getValue}
      </header>
    </div>
  );
}

export default App;

Child.js

import {useContext} from 'react'
import {MyContext} from './App.js'

const Child = () => {
    const myContext = useContext(MyContext)
    return (
        <>
        Renderd by Child {myContext.getValue}
        <button onClick={()=>myContext.changeValue(myContext.getValue + 1)}> Change value from Child Componet </button>    
        </>
    )
}
 export default Child;

希望我对您的理解是正确的,希望这对您有所帮助。