【问题标题】:React Modifying Textarea Values反应修改文本区域值
【发布时间】:2015-10-20 19:14:01
【问题描述】:

我正在做一个基本上是记事本的项目。我在进行 ajax 调用时更新

我的代码如下。

在父类中

<Editor name={this.state.fileData} />

在编辑器类中

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>
);
}

});

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

谢谢

编辑

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

$('#noter-text-area').val(this.props.name);

【问题讨论】:

  • 你在寻找来自 React 文档的 onChange 吗? facebook.github.io/react/docs/forms.html#controlled-components
  • On change 适用于 textarea 的值发生变化时。我真的不需要,只是希望 textarea 在其父类的状态更改时更新。
  • 你确定父母的状态真的在改变吗?
  • 我使用了一个 alert(this.state.fileData) 来测试,它似乎是。我也试过 但这不起作用。如果我更改 value 属性,它会更改但不可编辑。

标签: reactjs


【解决方案1】:

我想你想要的东西是:

家长:

<Editor name={this.state.fileData} />

编辑:

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>
    );
  }
});

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

React 16.8 更新:

import React, { useState } from 'react';

const Editor = (props) => {
    const [value, setValue] = useState(props.name);

    const handleChange = (event) => {
        setValue(event.target.value);
    };

    return (
        <form id="noter-save-form" method="POST">
            <textarea id="noter-text-area" name="textarea" value={value} onChange={handleChange} />
            <input type="submit" value="Save" />
        </form>
    );
}

Editor.propTypes = {
    name: PropTypes.string.isRequired
};

【讨论】:

  • 但文本区域中的文本不可编辑。如何解决这个问题? @phlie
  • @Bhanuprathap 应该是 - 你有什么问题?
  • React 组件将从后端获取 XML 并将其存储在 state 中并通过 value prop 传递给 textarea。以编程方式更改 xml,有时用户也会修改它。现在通过文本区域值属性,用户无法修改 xml。 @MatthewHerbst
  • @Bhanuprathap 听起来您应该针对您的问题提出一个新问题并发布您的代码。您可以在该问题中链接到该问题以供参考。
  • 老问题,但@Bhanuprathap 面临的问题是由于财产价值。如果您指定值,那么它就会受到控制,这意味着您必须设置状态(在类组件中)或使用状态(挂钩)。这就是为什么不渲染后端的值作为道具传递的原因。希望您已经解决了它,但它可以帮助其他人。
【解决方案2】:

作为 React 世界的新手,我遇到了类似的问题,我 could not edit textarea 和 struggled 绑定。在反应方面,值得了解 controlleduncontrolled 元素。

由于value,以下uncontrolled textarea的值无法更改

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

以下uncontrolled textarea的值可以因为使用defaultValueno value attribute而改变

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

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

以下controlled textarea的值可以改变,因为如何 值被映射到一个状态以及onChange 事件监听器

<textarea value={this.state.textareaValue} 
onChange={(event) => this.handleOnChange(event)}></textarea>

这是我使用不同语法的解决方案。我更喜欢auto-bind 而不是手动绑定,但是,如果我不使用{(event) =&gt; 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"));

库的版本是

"babel-cli": "6.24.1",
"babel-preset-react": "6.24.1"
"React & ReactDOM v15.5.4" 

【讨论】:

  • 或者只是onChange={this.handleOnChange.bind(this)}
猜你喜欢
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 2021-08-03
相关资源
最近更新 更多