【问题标题】:Pass value of form input to a sibling component in React将表单输入的值传递给 React 中的兄弟组件
【发布时间】:2020-04-08 12:51:36
【问题描述】:

我创建了一个表单,当用户做出选择时,我想将表单输入的值实时传递给同级组件。

我正在使用 react-hook-form 并且能够成功地使用 watch 查看用户输入的值,但我只知道如何将其传递给孩子,而不是兄弟姐妹。

App.js

这是父母

import React from 'react'
import Form from './Form';
import Message from './Message';

const App = () => {
  return (
     <div>
           <Form />
           <Message/>
     </div>
  );
};
export default App;

Form.js

这是孩子。

import React from 'react';
import { useForm } from 'react-hook-form';
import { Select, MenuItem } from '@material-ui/core';
import { Controller } from 'react-hook-form';

function Form() {

const {control, watch } = useForm();    
const watchDiet = watch('diet');

return(
   <form>
          <label htmlFor="diet">Dietary requirements</label>
          <Controller
            as={
              <Select name="diet">
                  <MenuItem value="meat">Meat eater</MenuItem>
                  <MenuItem value="veggie">Vegetarian</MenuItem>
                  <MenuItem value="vegan">Vegan</MenuItem>
                ))}
              </Select>
            }
            control={control}
            name="diet"
            id="diet"
          />

    </form>
);
}
export default Form;

Message.js

这是孩子的兄弟姐妹。我想将值传递给这个组件

import React from 'react';
const Message= (props) => {
  return (
      <div>
           If the user selects "Meat eater" in Form.js I want to 
           pass the value "meat" into this component
       </div>);
};
export default Message;

我对 React 很陌生,所以很难思考如何做到这一点。非常感谢 Wny 的指导。

非常感谢,

凯蒂

【问题讨论】:

  • 你从哪里获得 Form.js 中的 control 对象?
  • 对不起,我现在很忙。但我有几个建议。您需要将回调作为道具传递给 Form 并在满足特定条件时调用该回调。您需要有一种方法来处理该回调,该回调将该值写入状态变量。然后将该状态变量作为道具传递给消息组件。
  • @Adam Jeliński - 这是一个很好的观点......看起来我试图过于激进地削减我的代码!我会修改的。
  • @awran5 - 你是对的。我也错过了!我会再做一次修改。在我的真实代码中,这是在一个子组件中,但为了便于解释,我已将其全部放入表单中(除非我遗漏了它并不那么容易!!)

标签: reactjs forms react-hooks react-hook-form


【解决方案1】:

您可以做的是将您的 useForm() 钩子放在 App.js 中,这样两个孩子都可以使用它:

App.js

import React from 'react'
import Form from './Form';
import Message from './Message';
import { useForm } from 'react-hook-form';

const App = () => {
    const { watch, control } = useForm();    

    return (
        <div>
            <Form 
                watch={watch}
                control={control}
            />
            <Message
                watch={watch}
            />
        </div>
    );
};
export default App;

Form.js

import React from 'react';
import { useForm } from 'react-hook-form';

const Form = ({ watch, control }) => {
    const watchDiet = watch('diet');

    return(
        <form>
            <label htmlFor="diet">Dietary requirements</label>
            <Controller
                as={
                    <Select name="diet">
                        <MenuItem value="meat">Meat eater</MenuItem>
                        <MenuItem value="veggie">Vegetarian</MenuItem>
                        <MenuItem value="vegan">Vegan</MenuItem>
                    </Select>
                }
                control={control}
                name="diet"
                id="diet"
            />

        </form>
    );
}
export default Form;

【讨论】:

  • 我很喜欢这个想法。谢谢亚当!我的代码比我在示例中显示的要复杂得多,但我会试一试,如果它有效,我会告诉你! :-)
  • 亚当,你这个天才!我已经按照您的建议重新编写了我的代码,并且效果很好。非常感谢您的回复以及如此迅速的回复。如果可以的话,会给你更多的蜱虫!!
  • 非常感谢,我很高兴能提供帮助 :) 如果您想了解更多有关如何解决此问题的信息,这基于关于 lifting state up 的 React 指南。
  • 太好了,感谢您的参考 - 这非常有用!
  • 这不是我的用例,但仍然证明非常有价值 - 非常好!
猜你喜欢
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 2021-11-19
  • 2019-01-14
  • 2014-08-06
  • 1970-01-01
  • 2021-06-10
  • 2017-12-01
相关资源
最近更新 更多