Передача элемента вместо класса реакции в необязательно отображаемый модальный

У меня есть ячейка таблицы, по которой пользователь может щелкнуть, которая запустит модальное окно response-bootstrap, отображающее дополнительные сведения. В модальном окне отображается компонент, который имеет собственное состояние и может запускать действие по извлечению данных из серверной части, если в магазине нет необходимых данных.

В настоящее время я передаю компонент в качестве элемента реакции в OverlayMixin response-bootstrap, чтобы показать детали в модальном окне, но мне интересно, следует ли вместо этого передавать класс реакции и визуализировать его с помощью React.createElement.

Текущий код:

var MyCell = React.creatClass({
    _renderDetails: function () { return (<Details id={this.props.id}/>); 

    render: function() {
        return (
            <td>
                <MyModal modal={this._renderDetails()}>
                    {this.props.value}
                </MyModal>
            </td>
        );
     }
});

var MyModal = React.createClass({
    props: { content: React.PropTypes.element.isRequired }
    mixins: [OverlayMixin],

    // Called by the OverlayMixin when this component is mounted or updated.
    renderOverlay: function() {
        if (!this.state.isModalOpen) { return (<span/>); }
        return (
            <Modal className='information-modal' onRequestHide={this.handleToggle}>
                <div className='modal-body'>
                    {this.props.modal}
                </div>
            </Modal>
        );
    }
});

Причина, по которой я задаю этот вопрос, заключается в том, что я просматривал документацию Griddle, которая, похоже, вместо этого передать класс реакции.

var LinkComponent = React.createClass({
    render: function() { return <a href ... </a> } 
});
var columnMeta = [ { "customComponent": LinkComponent };

А затем рендеринг с помощью React.CreateElement. Исходный код

var colData = (<meta.customComponent data= ... />;
returnValue = <td>{colData}</td>);

// Turns into
var colData = React.createElement(meta.customComponent, {data: ...
returnValue = React.createElement("td" ... colData));

person David Forshner    schedule 19.06.2015    source источник


Ответы (2)


Поскольку Griddle использует свойство customComponent для отображения каждого элемента в столбце, он должен быть классом ReactComponent, иначе он будет отображать один и тот же компонент для каждой строки. Другими словами, customComponent представляет собой шаблон, на основе которого создается новый ReactElement. (Я лично предпочел бы иметь возможность передавать функцию, которая получает соответствующие свойства и возвращает ReactElement.)

В вашем случае вам нужно указать только один компонент, поэтому передача ReactElement имеет смысл. Он также более эффективен с точки зрения конечного пользователя, потому что вы можете создать компонент, подключенный к его родительскому элементу. Это также очень распространенный шаблон при использовании this.props.children.

person Michelle Tilley    schedule 20.06.2015

Во-первых, я бы не решился передавать JSX-код таким образом. React.js дает вам инструменты для метапрограммирования - внедрить обработчики событий и разметку в дочерние компоненты очень просто, и часто может показаться, что это самый простой способ сделать что-то. Там лежит разорение, ИМО. Такие динамически созданные компоненты всегда сложно отлаживать, поскольку трудно отследить, откуда что-то исходит. props и state лучше подходят для передачи более простых структур данных, разгружая фактическую логику рендеринга заинтересованным компонентам.

Справедливой критикой этого момента может быть: «Вот как это делают библиотеки вроде MaterialUI и ReactBootstrap! Они внедряют обратные вызовы и разметку повсюду». Что ж, они создают абстрактные интерфейсы и пользовательский интерфейс для разработчиков. У нас есть возможность создавать конкретные интерфейсы, которые могут заменить абстракцию на ясность и удобочитаемость. Нам не нужно все время абстрагироваться.

Тем не менее, к вашей конкретной проблеме: мне нравится идея передачи компонента через кусок JSX-кода, поскольку первый дает дочернему компоненту контроль над тем, как его отображать. MyModal должен отвечать за рендеринг своих дочерних элементов, а не просить своего родителя (через props) вместо этого выполнять работу. Это дает дополнительное преимущество, позволяя MyModal изменять детали после изменения состояния - прямо сейчас он просто получает статическую разметку для рендеринга.

person raorao    schedule 20.06.2015