React textarea with value 是只读的,但需要更新

Posted

技术标签:

【中文标题】React textarea with value 是只读的,但需要更新【英文标题】:React textarea with value is readonly but need to be updated 【发布时间】:2016-01-18 05:00:32 【问题描述】:

我的 React 应用程序中有一个文本区域,其中填充了一个值。我希望更新此文本区域并提交表单以更新数据库中的行。

<textarea id="description" className="materialize-textarea" length="120" value=description disabled=isDisabled></textarea>

描述变量用数据库中的值填充文本区域。该字段未禁用。

我尝试附加一个 onChange 事件,该事件调度一个动作 (redux) 来更改 textarea 的值,但它会为每个字母触发并且速度太慢。

如何创建一个由值填充且可编辑的文本区域?

谢谢!

【问题讨论】:

您希望在单击按钮时向您的服务器发送 POST 吗?什么时候按回车?当该字段不再处于焦点时? 我在提交表单时发布 【参考方案1】:

这是一个包含两个文本区域的组件。 props 和 state 之间存在受控关系。这是输入的关键。注意 componentWillReceiveProps。

    import React, Component from 'react';

    import Actions from '../../flux/Actions';

    let CurrentSnipDivSty = 
        height: 'calc(((100% - 40px) * .4) - 3px)',
        minHeight: '9.5em',
        width: '100%'
    ;

    let CurrentSnipTextAreaSty = 
        backgroundColor: '#213919',
        border: '1px solid #314929',
        color: '#afac87',
        fontSize: '1em',
        height: 'calc(50% - 20px)',
        overflowY: 'auto',
        padding: '5px',
        width: 'calc(100% - 12px)'
    ;

    class SnipsDetailRender extends Component 
        render() 
            let snip = this.state.snip.snip;
            let comment = this.state.snip.comment;

            return (
                <div id='CurrentSnipDivSty' style=CurrentSnipDivSty>
                    <textarea
                        value=snip
                        onChange=this.handleSnipChange
                        style=CurrentSnipTextAreaSty />
                    <textarea
                        value=comment
                        onChange=this.handleCommentChange
                        style=CurrentSnipTextAreaSty />
                </div>
            );
        
    

    export default class SnipsDetail extends SnipsDetailRender 
        constructor() 
          super();
            this.state =  snip: snip: '', comment: '' ;
        
        componentWillReceiveProps = (nextProps) => 
            if ((nextProps.data.snip != this.state.snip.snip) || (nextProps.data.comment != this.state.snip.comment))
             this.setState(snip: nextProps.data);
        
        handleSnipChange = (ev) => 
            let newSnip = snip: ev.target.value, comment: this.state.snip.comment;
            this.setState(snip: newSnip);
            Actions.saveSnipEdit(newSnip);
        
        handleCommentChange = (ev) => 
            let newSnip = snip: this.state.snip.snip, comment: ev.target.value;
            this.setState(snip: newSnip);
            Actions.saveSnipEdit(newSnip);
        
    

【讨论】:

我使用 Redux,所以状态是用另一种方式管理的。谢谢你的回答。 感谢您的回答【参考方案2】:

如果您发现使用 onChange 事件太慢,您可以简单地使用 refs 从提交处理程序中的 DOM 读取。此处显示了一个示例:

https://facebook.github.io/react/docs/tutorial.html#adding-new-comments

由于您使用的是 redux,您可能可以将很多功能导出到动作创建者。

【讨论】:

以上是关于React textarea with value 是只读的,但需要更新的主要内容,如果未能解决你的问题,请参考以下文章

react使用textarea给value赋值后获取到的是旧

React Context with Multiple State Values 不更新初始值

react表单

如何在 textarea 文本更改上保留光标位置?

[React Intl] Render Content with Placeholders using react-intl FormattedMessage

React:如何清除 TextArea?