You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React如何从另一个组件获取表单元素的数据?

点击Run按钮获取表单内容的实现方案

下面提供几种实用的实现方式,根据需求选择即可:

方案一:状态提升(推荐)

把表单的状态移到父组件FormViz中,让QueryForm成为受控组件,父组件直接持有表单值,点击按钮就能直接使用。

修改QueryForm组件

class QueryForm extends React.Component {
  render() {
    // 从props接收值和变更回调
    const { value, onChange } = this.props;
    return (
      <form>
        <label>
          <textarea value={value} onChange={onChange} />
        </label>
      </form>
    );
  }
}

修改FormViz组件

const FormViz = ({ queryString }) => {
  // 维护表单的状态
  const [formValue, setFormValue] = React.useState('Enter Query');
  queryString = `SELECT * FROM TABLE02`;
  const { loading, error, data } = useQuery(CONST_QUERY, {
    variables: { queryString },
    onCompleted: (data) => {
      console.log(data);
    },
  });

  // 点击Run按钮时获取表单内容
  const handleRunClick = () => {
    console.log('当前表单内容:', formValue);
    // 这里可以把formValue作为参数,执行你的查询逻辑
  };

  // 处理表单输入变更
  const handleFormChange = (event) => {
    setFormValue(event.target.value);
  };

  return (
    <div>
        <QueryForm value={formValue} onChange={handleFormChange} />
        <button onClick={handleRunClick}>Run</button>
    </div>
  );
};

方案二:通过组件Ref获取值

如果不想改动QueryForm的核心逻辑,可以给它添加一个获取值的方法,父组件用ref调用这个方法拿到内容。

修改QueryForm组件

class QueryForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      value: 'Enter Query'
    };
    this.handleChange = this.handleChange.bind(this);
  }

  handleChange(event) {
    this.setState({ value: event.target.value });
  }

  // 新增方法,供父组件调用获取当前值
  getQueryValue() {
    return this.state.value;
  }

  render() {
    return (
      <form>
        <label>
          <textarea value={this.state.value} onChange={this.handleChange} />
        </label>
      </form>
    );
  }
}

修改FormViz组件

const FormViz = ({ queryString }) => {
  // 创建ref指向QueryForm组件
  const queryFormRef = React.useRef(null);
  queryString = `SELECT * FROM TABLE02`;
  const { loading, error, data } = useQuery(CONST_QUERY, {
    variables: { queryString },
    onCompleted: (data) => {
      console.log(data);
    },
  });

  const handleRunClick = () => {
    // 通过ref调用子组件的方法获取值
    const formValue = queryFormRef.current.getQueryValue();
    console.log('当前表单内容:', formValue);
  };

  return (
    <div>
        <QueryForm ref={queryFormRef} />
        <button onClick={handleRunClick}>Run</button>
    </div>
  );
};

方案三:直接访问DOM元素

也可以给textarea添加ref,通过DOM元素直接获取输入值,这种方式适合简单场景。

修改QueryForm组件

class QueryForm extends React.Component {
  constructor(props) {
    super(props);
    // 创建ref指向textarea
    this.textareaRef = React.createRef();
    this.state = {
      value: 'Enter Query'
    };
    this.handleChange = this.handleChange.bind(this);
  }

  handleChange(event) {
    this.setState({ value: event.target.value });
  }

  getQueryValue() {
    return this.textareaRef.current.value;
  }

  render() {
    return (
      <form>
        <label>
          <textarea ref={this.textareaRef} value={this.state.value} onChange={this.handleChange} />
        </label>
      </form>
    );
  }
}

FormViz组件用法

和方案二完全一致,通过ref调用getQueryValue()方法即可拿到表单内容。


内容的提问来源于stack exchange,提问作者easythrees

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:07:29