繁体   English   中英

React.js在块元素上的双向绑定

[英]React.js two-way binding on block elements

我正在尝试使用react将值绑定到div,以便可以维护该元素的状态(例如on-off),似乎我应该使用LinkedStateMixin,但是下面的实验证明react不支持任意块级元素的属性。 这两个元素都有默认值,但是div e.target.value从其onclick处理程序返回未定义,而输入元素的值已正确设置。 知道如何将数据绑定到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/

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/

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

我对您的Fiddle进行了一些更新,现在它确实支持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以便当用户键入内容时它可以更新其值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM