如何将组件的状态传递给父级?

Posted

技术标签:

【中文标题】如何将组件的状态传递给父级?【英文标题】:How to pas state of component up to parent? 【发布时间】:2019-10-23 20:47:03 【问题描述】:

我正在使用 FormContainer 组件,它接收初始值(基本上是表示输入值的空字符串)和来自父级的 handleSubmit 函数。 FormContainer 具有包含输入值的状态,用于更新状态的 onChange 方法,onSubmit 方法。我正在使用反应上下文将 onChange 传递给输入,并将 onSubmit 传递给提交按钮。

FormContainer 代码:

export const FormContext = React.createContext(null);

class FormContainer extends Component 
  constructor(props) 
  super(props);
  this.state = props.initialValue;


onChange(name, value) 
  this.setState( [name]: value );


onSubmit()
  const stateKostul = this.state;
  console.log(stateKostul);
  this.props.handleSubmit(stateKostul);


render() 
  const value=
    formState: this.state,
    onChange: (name, value) => this.onChange(name, value),
    onSubmit: () =>this.onSubmit(),
  ;
  return (
    <FormContext.Provider value=value>
      this.props.children
    </FormContext.Provider>
  ); 
 

我在 AddProductForm 组件/场景中使用它。我还使用 recompose 添加处理程序以获取数据。

AddProductForm代码:

function AddProductForm( handleSubmit ) 
  const initialValue = 
    title: '',
    location: '',
    description: '',
    photos: [],
    price: '',
  ;

  return (
    <div className=s.container>
      <h2 className=s.formTitle>Add product</h2>
      <div className=s.formContainer>
        <FormContainer 
         initialValue=initialValue
         handleSubmit=handleSubmit
        >
           // custom inputs and submit button
        </FormContainer>
      </div>
    </div>
  );


const enhancer = compose(
  withHandlers(
    handleSubmit: (stateKostul) => () => 
      console.log('it works!');
      console.log(stateKostul);
      //fetch to server
    ,
  ),
);

export default enhancer(AddProductForm);

所以我的问题是我不知道如何将数据从 FormContainer 的状态传递到 AddProductForm。当我将 FormContainer 的状态从道具传递给我的处理程序时,我无法定义。但是从 onSubmit 状态就可以了。

由于 FormContainer 背后的想法,我无法从 FormContainer 获取数据:它应该对任何表单都是通用的。

有什么想法可以在不改变其结构的情况下从 FormContainer 获取数据吗?

【问题讨论】:

【参考方案1】:

我不熟悉 FormContext/Enhancer,但是我认为您的错误出在增强器中。 您正在解构从 onSubmit 处理程序返回的对象,以寻找属性“stateKostul”。 “stateKostul”可能没有在 FormContainer 的状态中定义。这只是您传递给它的变量的名称。

尝试改变:

handleSubmit: (stateKostul) => () => 
      console.log('it works!');
      console.log(stateKostul);
      //fetch to server

到:

handleSubmit: (stateKostul) => () => 
      console.log('it works!');
      console.log(stateKostul);
      //fetch to server

【讨论】:

【参考方案2】:

我将 AddProductForm 从功能组件更改为类组件,并添加了方法 handleSubmit。猜猜这个问题是关于上下文的。不知道如何,但它现在可以工作了

这是我的代码:

class AddProductForm extends React.Component
  constructor(props)
    super(props);
    this.state = 
      title: '',
      location: '',
      description: '',
      photos: [],
      price: '',
    ;
    this.handleSubmit = this.handleSubmit.bind(this);
  

  handleSubmit(stateKostul) 
    console.log('it works!');
    console.log(stateKostul);
    //fetch to server
  


  render() 
    return (
      <div className=s.container>
        <h2 className=s.formTitle>Add product</h2>
        <div className=s.formContainer>
          <FormContainer initialValue=this.state handleSubmit=this.handleSubmit>
            // custom inputs and submit button
          </FormContainer>
        </div>
      </div>

    );
  

【讨论】:

以上是关于如何将组件的状态传递给父级?的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2:仅当表单数据有效时才将表单数据从子级传递给父级

将数据从组件传递给父级

React - 在下拉选择中将状态从子级传递给父级

通过反应上下文 api 将子状态传递给父组件

将对象从子状态传递给父状态

SwiftUI - 按钮 - 如何将函数请求传递给父级