问题
我正在尝试编写日志/组织应用程序,但遇到了令人沮丧的错误。
这是我的组件:
- import React from 'react';
- const Note = (props) => {
- let textarea, noteForm;
- if (props.note) {
- return (
- <div>
- <button onClick={() => {
- props.handleUpdateClick(props.selectedFolderId, props.selectedNoteId, textarea.value);
- }}>
- Update
- </button>
- <textarea
- defaultValue={props.note.body}
- ref={node => {textarea = node;}}
- />
- </div>
- );
- } else {
- return <div></div>;
- }
- };
- export default Note;
复制代码
当前的情况是,每当我在notes之间切换并重新提交note.body属性中带有新内容的note组件时,文本区域不会改变并保留上一个note的内容。我尝试过使用textarea的value属性而不是defaultValue属性,这并不能解决组件重新提交时textarea内容不改变的问题,但是当我这样做时,我&#39 ;m 可以通过在 textarea 字段中输入来更新
有谁知道我既可以允许用户在文本字段中键入以更新注释,又可以在我呈现不同的注释时更改文本区域的内容的方法?
谢谢
回答
问题是将该值设置为道具将导致组件的所有重新渲染都使用相同的道具,因此新文本将被删除。一种解决方案是将文本保存在组件的本地状态中。要同时监听 props 变化,可以设置接收到新 props 时的状态。
- const Note = React.createClass({
- getInitialState() {
- return {
- text : this.props.note.body
- }
- },
- componentWillReceiveProps: function(nextProps) {
- if (typeof nextProps.note != 'undefined') {
- this.setState({text: nextProps.note.body });
- }
- },
- render() {
- if (this.props.note) {
- return (
- <div>
- <button onClick={(e) => {
- // Fire a callback that re-renders the parent.
- // render(this.textarea.value);
- }}>
- Update
- </button>
- <textarea
- onChange={e => this.setState({ text : e.target.value })}
- value={this.state.text}
- ref={node => {this.textarea = node;}}
- />
- </div>
- );
- } else {
- return <div></div>;
- }
- }
- });
复制代码
如果您正在使用 redux,您还可以在输入的更改事件上触发一个操作以触发重新渲染。您可以将输入值保存在减速器中。
|