【问题标题】:Submitting form with textarea in React在 React 中使用 textarea 提交表单
【发布时间】:2019-12-26 01:09:00
【问题描述】:

我有一个文本区域,我想在提交表单时将其字符串化为 JSON。我什至会满足于让函数设置 textarea 值。

import React from 'react';

export default class ClinicalMain extends React.Component {
  constructor(props) {
    super(props);
  }

  state = {selectedOption: ''}

  // my function to update the textarea
  reactStringify() {
    let obj = {
      name: "bob",
      age: 4
    }

    console.log('in stringify');
    let value = JSON.stringify(obj);
  }

  componentDidMount() { }

  render() {
    return (
      <React.Fragment>
        <form>
          <button type="button" 
                  onClick={this.reactStringify} 
                  id="reactid"
          >React stringify</button>
          <textarea value={this.value} 
                    defaultValue="" 
                    rows="10" cols="80"
          ></textarea>
          <br />
        </form>
      </React.Fragment>
    )
  }
}

let value 不会更新。我需要使用setState 吗? this?

【问题讨论】:

  • 我只是想在函数中设置任何值来更改/更新 textarea 框的值....似乎应该“简单”但有问题
  • 欢迎来到 SO!对不起,但我不太清楚你想要完成什么。您能否阐明用户应该在文本区域中输入什么内容,以及单击按钮时会发生什么?在不确切知道应该发生什么的情况下,我可以说你会想尝试使用this.setState() 来设置状态。
  • 我想要调用函数(它确实如此),然后让它将 textarea 的值设置为任何东西(我想设置为整个表单的 json stringify)只是想让它更新
  • @ggorlen 见上面的评论。所以如果我使用 this.setState(put what here?)
  • 不仅如此。我会read the docs--这对 React 来说是非常基础的,而且这个代码的设置方式表明这个页面还没有被查看过。您需要使用 this.state.valuethis.setState({value: "foobar"}) 的受控组件。

标签: javascript reactjs forms jsx


【解决方案1】:

代码中有许多问题表明对优秀的React tutorial 缺乏熟悉。与任何图书馆一样,在深入研究之前有必要花时间阅读手册。

  1. 不应直接修改状态。使用this.setState() 修改状态。 this.setState() 不能立即工作;它只是通知 React 库状态需要更新,React 会在它认为合适的时候自行处理更新。

    除此之外,let value = ... 是一个纯粹的局部变量,而不是类变量,所以无论如何this.valuerender 中都是未定义的;换句话说,上面的代码并没有试图以任何方式修改或访问state

  2. 尝试访问this 的类函数需要绑定。例如,onClick={this.reactStringify} 传递对this.reactStringify 函数的引用,但this 将在this.reactStringify 内部未定义,除非使用箭头函数(隐式绑定this),或者this 被显式绑定:

    this.handleChange = this.handleChange.bind(this);
    

    对于类组件,显式被认为是比箭头函数方法更好的做法,因为它只需要一次调用 bind

  3. React 通常使用名为 controlled components 的东西来监听文本字段的变化。这意味着元素的值会跟踪组件状态并充当唯一的事实来源。

虽然我不确定您最终想要完成什么,但这里有一个工作示例,可以让您再次行动起来,它演示了上述概念。

class ClinicalMain extends React.Component {
  constructor(props) {
    super(props);
    this.state = {value: ""};
    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }
  
  handleChange(e) {
    this.setState({value: e.target.value});
  }

  handleSubmit(e) {
    e.preventDefault();
    this.setState(state => ({
      output: `you wrote: "${state.value}"`
    }));
  }

  render() {
    return (
      <React.Fragment>
        <form onSubmit={this.handleSubmit}>
          <textarea 
            value={this.state.value}
            onChange={this.handleChange}
          ></textarea>
          <input type="submit" value="Show output" />
        </form>
        <div>{this.state.output}</div>
      </React.Fragment>
    );
  }
}

ReactDOM.render(
  <ClinicalMain name="World" />,
  document.getElementById("app")
);
input {
  display: block;
}

form {
  margin-bottom: 0.4em;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="app"></div>

以下是提供更多详细信息的文档的相关部分:

【讨论】:

  • thx,我需要问另一个问题......因为我现在想要获取整个表单并将其字符串化并将其放入 textarea 框中。我在看new FormData(this.form);,但还没有弄清楚。
  • 这基本上就是我在 cmets 部分中提示您的内容。我不太清楚你在这里做什么。什么构成了整个表格?你说的字符串化是什么意思? textarea 已经是一个字符串。您可以发布您正在使用的普通 HTML 结构并解释所需的结果。但在这一点上,我建议提出一个新问题,因为它开始变成一个移动的球门柱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多