BB  React
1. React view

Text

import { View } from 'backbone.marionette';
import { createElement } from 'react';
import ReactDOM from 'react-dom';

/**
 * Wrapper for React views
 *
 * @class ReactView
 * @extends Mn.View
 */
export class ReactView extends View {
    render () {
        if (!this.reactComponent) {
            throw new Error('BackboneReactView requires "reactComponent" attribute');
        }

        ReactDOM.render(
            createElement(this.reactComponent, this.serializeData(), null),
            this.el
        );

        // mimicking Mn render
        this._isRendered = true;
        this.triggerMethod('render', this);
        return this;
    }

    destroy () {
        ReactDOM.unmountComponentAtNode(this.el);
        super.destroy();
    }
}
2. Data sub

Text

function useBackbone(modelOrCollection) {
    const [attributes, setAttributes] = useState([]);

    useEffect(() => pullAndSetData(), []);

    const subscribe = () => {
        if (modelOrCollection instanceof Backbone.Collection) {
            modelOrCollection.on('add remove change reset sort sync', pullAndSetData);
        } else {
            modelOrCollection.on('change', pullAndSetData);
        }
    };

    const pullAndSetData = () => {
        let attributesData;

        if (modelOrCollection instanceof Backbone.Collection) {
            attributesData = [...modelOrCollection.models.map((model) => model.attributes)];
        } else {
            attributesData = {...modelOrCollection.attributes};
        }

        setAttributes(attributesData);
    };

    useEffect(() => {
        subscribe();

        return () => {
            modelOrCollection.off(null, null, this);
        };
    }, []);

    return attributes;
}

export { useBackbone };

BB -> React

By Ante Jan

BB -> React

  • 5