React修改Textarea值

phl*_*lie 37 reactjs

我正在研究一个基本上是记事本的项目.虽然在进行ajax调用时更新了它的值,但我遇到了问题.我尝试设置textarea的value属性,但是不能对其值进行更改.如何在状态上进行更改textarea的值更改并可以进行编辑.

我的代码如下.

在父类中

<Editor name={this.state.fileData} />
Run Code Online (Sandbox Code Playgroud)

在Editor类中

var Editor = React.createClass({
render: function() {
return (
    <form id="noter-save-form" method="POST">
    <textarea id="noter-text-area" name="textarea" value={this.props.name}></textarea>
    <input type="submit" value="Save" />
    </form>
);
}
Run Code Online (Sandbox Code Playgroud)

});

我不能使用defaultValue,因为textarea的值在页面加载时是未知的,当我尝试将数据放在textareas之间时没有任何反应.我希望它在状态发生变化时采用状态值,但在两者之间可编辑.

谢谢

编辑

我设法使用jQuery工作,但我想在React中这样做,我在渲染之前调用它:

$('#noter-text-area').val(this.props.name);
Run Code Online (Sandbox Code Playgroud)

Mat*_*bst 53

我想你想要的东西是这样的:

家长:

<Editor name={this.state.fileData} />
Run Code Online (Sandbox Code Playgroud)

编辑:

var Editor = React.createClass({
  displayName: 'Editor',
  propTypes: {
    name: React.PropTypes.string.isRequired
  },
  getInitialState: function() { 
    return {
      value: this.props.name
    };
  },
  handleChange: function(event) {
    this.setState({value: event.target.value});
  },
  render: function() {
    return (
      <form id="noter-save-form" method="POST">
        <textarea id="noter-text-area" name="textarea" value={this.state.value} onChange={this.handleChange} />
        <input type="submit" value="Save" />
      </form>
    );
  }
});
Run Code Online (Sandbox Code Playgroud)

这基本上是https://facebook.github.io/react/docs/forms.html上提供的示例的直接副本

  • 但是文本在文本区域中不可编辑。如何解决呢?@phlie (3认同)
  • @Bhanuprathap听起来像你应该问一个新的问题来解决你的问题并发布你的代码.您可以在该问题中链接到此问题以供参考. (2认同)
  • 老问题,但@Bhanuprathap 面临的问题是由于财产价值。如果您指定值,那么它就会受到控制,这意味着您必须 setState (在类组件中)或 useState (挂钩)。这就是为什么作为 props 传递的后端值不会被渲染。希望您已经解决了这个问题,但它可以帮助其他人。 (2认同)

Raf*_*Raf 11

作为 React 世界的新手,我could not edit在 textarea 和struggledbinding 中遇到了类似的问题。当涉及到反应时,值得了解controlled和了解uncontrolled元素。

由于以下uncontrolled textarea原因无法更改以下值value

 <textarea type="text" value="some value"
    onChange={(event) => this.handleOnChange(event)}></textarea>
Run Code Online (Sandbox Code Playgroud)

以下的值uncontrolled textarea可以因为使用defaultValue或改变no value attribute

<textarea type="text" defaultValue="sample" 
    onChange={(event) => this.handleOnChange(event)}></textarea>

<textarea type="text" 
   onChange={(event) => this.handleOnChange(event)}></textarea>
Run Code Online (Sandbox Code Playgroud)

由于值controlled textarea如何映射到状态以及onChange事件侦听器,可以更改以下值

<textarea value={this.state.textareaValue} 
onChange={(event) => this.handleOnChange(event)}></textarea>
Run Code Online (Sandbox Code Playgroud)

这是我使用不同语法的解决方案。auto-bind但是,我更喜欢手动绑定,如果我不使用{(event) => this.onXXXX(event)},那将导致内容textarea不可编辑或event.preventDefault()无法按预期工作。我想还有很多东西要学。

class Editor extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      textareaValue: ''
    }
  }
  handleOnChange(event) {
    this.setState({
      textareaValue: event.target.value
    })
  }
  handleOnSubmit(event) {
    event.preventDefault();
    this.setState({
      textareaValue: this.state.textareaValue + ' [Saved on ' + (new Date()).toLocaleString() + ']'
    })
  }
  render() {
    return <div>
        <form onSubmit={(event) => this.handleOnSubmit(event)}>
          <textarea rows={10} cols={30} value={this.state.textareaValue} 
            onChange={(event) => this.handleOnChange(event)}></textarea>
          <br/>
          <input type="submit" value="Save"/>
        </form>
      </div>
  }
}
ReactDOM.render(<Editor />, document.getElementById("content"));
Run Code Online (Sandbox Code Playgroud)

库的版本是

"babel-cli": "6.24.1",
"babel-preset-react": "6.24.1"
"React & ReactDOM v15.5.4" 
Run Code Online (Sandbox Code Playgroud)