动态地将事件处理程序添加到React.DOM元素

金茂

我正在使用RadioButtonGroup组件,它类似于单选输入,但带有按钮:

在此处输入图片说明

像这样简单地使用该组件将是很好的:

var SelectThing = React.createClass({
    render: function render() {
        // I would not like to add onClick handler to every button element
        // outside the RadioButtonGroup component
        return (
            <RadioButtonGroup onChange={this._onActiveChange}>
                <button>Thing 1</button>
                <button>Thing 2</button>
                <button>Thing 3</button>
            </RadioButtonGroup>
        )
    },

    _onActiveChange: function _onActiveChange(index) {
        console.log('You clicked button with index:', index);
    }
});

实际的问题:如何使用React最完美地实现这一目标?(我发现了另一个类似的问题,但并不能完全回答这个问题)。

我的第一个直觉是在组件内部添加和删除onClick处理程序,以从组件用户中删除样板代码。我想到的另一种选择是给例如<p>元素而不是按钮元素,并将它们放在将在RadioButtonGroup组件内部创建的按钮元素内。我不太喜欢后者,因为与传递按钮相比,它在语义上没有太大意义。

这是(显然不起作用)组件现在的样子:

// Radio input with buttons
// http://getbootstrap.com/javascript/#buttons-checkbox-radio
var RadioButtonGroup = React.createClass({
    getInitialState: function getInitialState() {
        return {
            active: this.props.active || 0
        };
    },

    componentWillMount: function componentWillMount() {
        var buttons = this.props.children;
        buttons[this.props.active].className += ' active';

        var self = this;
        buttons.forEach(function(button, index) {
            // How to dynamically set onclick handler for virtual dom
            // element created inside JSX?
            button.addEventListener('onClick', function(event) {
                self._onAnyButtonClick(index, event);
            }
        });
    },

    componentWillUnmount: function componentWillUnmount() {
        var buttons = this.props.children;

        buttons.forEach(function(button, index) {
            button.removeEventListener('onClick');
        });  
    },

    render: function render() {
        return (
            <div className="radio-button-group">
                {buttons}
            </div>
        )
    },

    _onAnyButtonClick: function _onAnyButtonClick(index, event) {
        this.setState({
            active: index
        });

        this.props.onChange(index);
    }
});
肖恩

您不想弄乱每个按钮上的单击处理程序,只需监听容器上的单击即可。然后根据单击哪个孩子来更新状态。

另外,使用React最好将所有DOM内容保留在render函数中。在这种情况下,定义元素的类名。

这是如何工作的:

var RadioButtonGroup = React.createClass({
    getInitialState: function getInitialState() {
        return {
            active: this.props.active || 0
        };
    },

    clickHandler: function clickHandler(e) {
        // Getting an array of DOM elements
        // Then finding which element was clicked
        var nodes = Array.prototype.slice.call( e.currentTarget.children );
        var index = nodes.indexOf( e.target );
        this.setState({ active: index });
    },

    render: function render() {
        var buttons = this.children.map(function(child, i) {
            if (i === this.state.active) child.props.className += ' active';
            return child;
        }, this);

        return (
            <div className="radio-button-group" onClick={ this.clickHandler }>
                { buttons }
            </div>
        )
    }
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

动态地将元素添加到HTML页面

来自分类Dev

将事件处理程序添加到动态添加的span元素

来自分类Dev

如何将处理程序添加到dom元素

来自分类Dev

React / Rails:将元素动态添加到DOM

来自分类Dev

如何动态地将ng-pattern属性添加到html元素?

来自分类Dev

如何动态地将画布添加到div元素?

来自分类Dev

如何动态地将ng-pattern属性添加到html元素?

来自分类Dev

如何使用jquery动态地将元素添加到SVG图像?

来自分类Dev

在php中动态地将css类添加到html元素

来自分类Dev

在创建DOM之后将事件添加到元素

来自分类Dev

根据同级兄弟上一类动态地将addClass()添加到元素吗?

来自分类Dev

AngularJS:将加载程序元素添加到DOM的顶部

来自分类Dev

React Native-在按下按钮时将元素动态添加到DOM

来自分类Dev

动态将事件监听器添加到dom

来自分类Dev

动态将事件监听器添加到dom

来自分类Dev

jQuery将元素添加到先前定义的事件处理程序

来自分类Dev

如何将 onClick 事件处理程序添加到画布元素(弧)?

来自分类Dev

将元素添加到DOM中的深层元素

来自分类Dev

将数据添加到动态创建的元素并绑定事件

来自分类Dev

将鼠标事件添加到动态创建的元素Vuejs

来自分类Dev

在Wicket中将动态元素ID添加到dom

来自分类Dev

让jQuery处理添加到DOM中的元素

来自分类Dev

将 jQuery 事件处理程序附加到将重复替换的 dom 元素的正确方法是什么?

来自分类Dev

将事件侦听器添加到基于类的DOM元素

来自分类Dev

将 DOM 事件添加到多个元素并影响孩子的风格

来自分类Dev

将元素数组添加到dom

来自分类Dev

如何将EventListener添加到将来的dom元素?

来自分类Dev

根据内容将类添加到DOM中的元素

来自分类Dev

将命名空间添加到DOM元素python

Related 相关文章

  1. 1

    动态地将元素添加到HTML页面

  2. 2

    将事件处理程序添加到动态添加的span元素

  3. 3

    如何将处理程序添加到dom元素

  4. 4

    React / Rails:将元素动态添加到DOM

  5. 5

    如何动态地将ng-pattern属性添加到html元素?

  6. 6

    如何动态地将画布添加到div元素?

  7. 7

    如何动态地将ng-pattern属性添加到html元素?

  8. 8

    如何使用jquery动态地将元素添加到SVG图像?

  9. 9

    在php中动态地将css类添加到html元素

  10. 10

    在创建DOM之后将事件添加到元素

  11. 11

    根据同级兄弟上一类动态地将addClass()添加到元素吗?

  12. 12

    AngularJS:将加载程序元素添加到DOM的顶部

  13. 13

    React Native-在按下按钮时将元素动态添加到DOM

  14. 14

    动态将事件监听器添加到dom

  15. 15

    动态将事件监听器添加到dom

  16. 16

    jQuery将元素添加到先前定义的事件处理程序

  17. 17

    如何将 onClick 事件处理程序添加到画布元素(弧)?

  18. 18

    将元素添加到DOM中的深层元素

  19. 19

    将数据添加到动态创建的元素并绑定事件

  20. 20

    将鼠标事件添加到动态创建的元素Vuejs

  21. 21

    在Wicket中将动态元素ID添加到dom

  22. 22

    让jQuery处理添加到DOM中的元素

  23. 23

    将 jQuery 事件处理程序附加到将重复替换的 dom 元素的正确方法是什么?

  24. 24

    将事件侦听器添加到基于类的DOM元素

  25. 25

    将 DOM 事件添加到多个元素并影响孩子的风格

  26. 26

    将元素数组添加到dom

  27. 27

    如何将EventListener添加到将来的dom元素?

  28. 28

    根据内容将类添加到DOM中的元素

  29. 29

    将命名空间添加到DOM元素python

热门标签

归档