React.js对块元素的双向绑定

时间:2015-01-17 01:22:57

标签: javascript html reactjs

我正在尝试将一个值绑定到一个带有反应的div,以便我可以维持该元素的状态(例如,开 - 关)看起来我应该使用LinkedStateMixin,但我的实验证明反应没有t支持块级元素的任意属性。两个元素都有默认值,但div e.target.value从其onclick处理程序返回undefined,而输入元素值已正确设置。知道如何将数据绑定到div吗?谢谢!

var Component = React.createClass({
    mixins: [React.addons.LinkedStateMixin],
    getInitialState: function() {
        return {message: 'Hello!'};
    },
    render: function () {
        var valueLink = this.linkState('message');
        var handleClick = function(e) {
            console.log(e.target.value);
            valueLink.requestChange(e.target.value);
        };
        return (
        <div>
            <input type="text" onClick={handleClick} defaultValue={valueLink.value} />
            <div onClick={handleClick} defaultValue={valueLink.value}>
                {this.state.message}
            </div>
        </div>
    );
    }
});

React.render(<Component />, document.body);

http://jsfiddle.net/su8r5Lob/

2 个答案:

答案 0 :(得分:2)

var Component = React.createClass({
    mixins: [React.addons.LinkedStateMixin],
    getInitialState: function() {
        return {
            message: 'Hello!',
            active: false
        };
    },
    inputClick : function(e) {
        console.log(e.target.value);
    },
    toggleActive : function(e){
        console.log('div state', this.state.active);
        var newState = !this.state.active;
        this.setState({active: newState});
    },
    render: function () {
        var cx = React.addons.classSet;
        var valueLink = this.linkState('message');
        var classes = cx({
            'base-class': true,
            'element-active': this.state.active
        });

        return (
        <div>
            <input type="text" onClick={this.inputClick} defaultValue={valueLink.value} />
            <div onClick={this.toggleActive} className={classes}>
                {this.state.message}
            </div>
        </div>
    );
   }
});

React.render(<Component />, document.body);

http://jsfiddle.net/su8r5Lob/1/

答案 1 :(得分:1)

您的代码无效的原因是<div>元素没有value属性。只有接收用户输入的元素才有。因此,在调用handleClick时,valueLink.requestChange会收到undefined作为参数。

我已经更新了你的小提琴,现在它确实支持onChange事件的双向绑定。

var Component = React.createClass({
    mixins: [React.addons.LinkedStateMixin],
    getInitialState: function() {
        return {message: 'Hello!'};
    },
    render: function () {
        var valueLink = this.linkState('message');
        var handleClick = function(e) {
            console.log(e.target.value);
            valueLink.requestChange(e.target.value);
        };
        return (
        <div>
            <input type="text" onChange={handleClick} value={valueLink.value} />
            <input type="text" onChange={handleClick} value={valueLink.value} />
        </div>
    );
    }
});

React.render(<Component />, document.body);

但是,如果你想将它绑定到div元素,我会给你这个建议。我不确定它是否完全符合您的期望,但现在是:

var Component = React.createClass({
    mixins: [React.addons.LinkedStateMixin],
    getInitialState: function() {
        return {message: 'Hello!'};
    },
    render: function () {
        var valueLink = this.linkState('message');
        var handleClick = function(e) {
            console.log(e.target.value);
            valueLink.requestChange(e.target.value);
        };
        return (
        <div>
            <input type="text" onChange={handleClick} value={valueLink.value} />
            <div onClick={handleClick.bind(this, {target: {value: 'someDivValue'}})} defaultValue={valueLink.value}>
                {this.state.message}
            </div>
        </div>
    );
    }
});

React.render(<Component />, document.body);

请注意,我给div一个默认值,每次用户点击它时都会设置为valueLink。我必须将输入事件更改为onchange,以便在用户输入内容时更新其值。