ReactJS:onClick更改元素

jan*_*s86 17 javascript reactjs

我刚开始学习React并有一个问题.

我想做以下事情:

如果用户单击某个段落,我想将该元素更改为具有预填充段落内容的输入字段.(如果用户具有某些特权,最终目标是直接编辑)

我走到这一步,但完全不知所措.

var AppHeader = React.createClass({
    editSlogan : function(){
        return (
            <input type="text" value={this.props.slogan} onChange={this.saveEdit}/>
         )
    },
    saveEdit : function(){
        // ajax to server
    },
    render: function(){
        return (
            <header>
                <div className="container-fluid">
                    <div className="row">
                        <div className="col-md-12">
                            <h1>{this.props.name}</h1>
                            <p onClick={this.editSlogan}>{this.props.slogan}</p>
                        </div>
                    </div>
                </div>
            </header>
        );
    }
});
Run Code Online (Sandbox Code Playgroud)

如何从editSlogan函数中覆盖渲染?

Sil*_*rom 40

如果我正确理解您的问题,您希望在"onClick"事件的情况下呈现不同的元素.

这是反应状态的一个很好的用例.

以下面的例子为例

React.createClass({ 
    getInitialState : function() {
       return { showMe : false };
    },
    onClick : function() {
       this.setState({ showMe : true} );
    },
    render : function() {
        if(this.state.showMe) { 
            return (<div> one div </div>);
        } else { 
            return (<a onClick={this.onClick}> press me </a>);
        } 
    }
})
Run Code Online (Sandbox Code Playgroud)

这将改变组件状态,并使React呈现div而不是a-tag.当组件状态被改变时(使用setState方法),React计算它是否需要重新渲染自己,并且在这种情况下,它需要重新渲染组件的哪些部分.

更多关于州 https://facebook.github.io/react/docs/interactivity-and-dynamic-uis.html

  • 太棒了!我觉得自己很愚蠢,但我学到了很多!非常感谢! (2认同)

Iva*_*pov 5

你可以用更清晰的方式解决它:

class EditableLabel extends React.Component {

    constructor(props) {
        super(props);
        this.state = {
            text: props.value,
            editing: false
        };
        this.initEditor();
        this.edit = this.edit.bind(this);
        this.save = this.save.bind(this);
    }

    initEditor() {
        this.editor = <input type="text" defaultValue={this.state.text} onKeyPress={(event) => {
            const key = event.which || event.keyCode;
            if (key === 13) { //enter key
                this.save(event.target.value)
            }
        }} autoFocus={true}/>;
    }

    edit() {
        this.setState({
            text: this.state.text,
            editing: true
        })
    };

    save(value) {
        this.setState({
            text: value,
            editing: false
        })
    };

    componentDidUpdate() {
        this.initEditor();
    }

    render() {
        return this.state.editing ?
            this.editor
            : <p onClick={this.edit}>{this.state.text}</p>
    }
}

//and use it like <EditableLabel value={"any external value"}/>;
Run Code Online (Sandbox Code Playgroud)