Zoeken…


Invoering

Laten we zeggen dat we ons laten inspireren door enkele ideeën van moderne gebruikersinterfaces die in programma's worden gebruikt en deze omzetten in React-componenten. Dat is waar het onderwerp " Gebruikersinterface-oplossingen " uit bestaat. Attributie wordt gewaardeerd.

Basisvenster

import React from 'react';

class Pane extends React.Component {
    constructor(props) {
        super(props);
    }

    render() {
        return React.createElement(
            'section', this.props
        );
    }
}

Paneel

import React from 'react';

class Panel extends React.Component {
    constructor(props) {
        super(props);
    }
    
    render(...elements) {
        var props = Object.assign({
            className: this.props.active ? 'active' : '',
            tabIndex: -1
        }, this.props);

        var css = this.css();
        if (css != '') {
            elements.unshift(React.createElement(
                'style', null,
                css
            ));
        }

        return React.createElement(
            'div', props,
            ...elements
        );
    }
    
    static title() {
        return '';
    }
    static css() {
        return '';
    }
}

Grote verschillen met het eenvoudige venster zijn:

  • paneel heeft focus bijvoorbeeld wanneer het wordt aangeroepen door een script of waarop met de muis wordt geklikt;
  • paneel heeft title statische methode per component, dus het kan worden uitgebreid door andere paneelcomponent met een overschreven title (reden hier is dat functie dan opnieuw kan worden opgeroepen bij het renderen voor lokalisatiedoeleinden, maar binnen de grenzen van dit voorbeeld heeft title geen zin) ;
  • het kan individuele stylesheets bevatten die zijn gedeclareerd in de statische css methode (u kunt vooraf de inhoud van het bestand laden vanaf PANEL.css ).

tab

import React from 'react';

class Tab extends React.Component {
    constructor(props) {
        super(props);
    }

    render() {
        var props = Object.assign({
            className: this.props.active ? 'active' : ''
        }, this.props);
        return React.createElement(
            'li', props,
            React.createElement(
                'span', props,
                props.panelClass.title()
            )
        );
    }
}

panelClass eigenschap panelClass van de instantie Tab moet de panelClass bevatten die wordt gebruikt voor de beschrijving.

PanelGroup

import React from 'react';
import Tab from './Tab.js';

class PanelGroup extends React.Component {
    constructor(props) {
        super(props);
        this.setState({
            panels: props.panels
        });
    }

    render() {
        this.tabSet = [];
        this.panelSet = [];
        for (let panelData of this.state.panels) {
            var tabIsActive = this.state.activeTab == panelData.name;
            this.tabSet.push(React.createElement(
                Tab, {
                    name: panelData.name,
                    active: tabIsActive,
                    panelClass: panelData.class,
                    onMouseDown: () => this.openTab(panelData.name)
                }
            ));
            this.panelSet.push(React.createElement(
                panelData.class, {
                    id: panelData.name,
                    active: tabIsActive,
                    ref: tabIsActive ? 'activePanel' : null
                }
            ));
        }
        return React.createElement(
            'div', { className: 'PanelGroup' },
            React.createElement(
                'nav', null,
                React.createElement(
                    'ul', null,
                    ...this.tabSet
                )
            ),
            ...this.panelSet
        );
    }

    openTab(name) {
        this.setState({ activeTab: name });
        this.findDOMNode(this.refs.activePanel).focus();
    }
}

eigenschap panels van de instantie PanelGroup moet een array met objecten bevatten. Elk object daar geeft belangrijke gegevens over panelen aan:

  • name - ID van het paneel dat wordt gebruikt door het controller-script;
  • class - de klasse van het panel.

Vergeet niet om eigenschap activeTab te stellen op de naam van het benodigde tabblad.

Verduidelijking

Wanneer het tabblad omlaag is, wordt het benodigde paneel de klassennaam active op het DOM-element (betekent dat het zichtbaar zal zijn) en is het nu gericht.

Voorbeeldweergave met `PanelGroup`s

import React from 'react';
import Pane from './components/Pane.js';
import Panel from './components/Panel.js';
import PanelGroup from './components/PanelGroup.js';

class MainView extends React.Component {
    constructor(props) {
        super(props);
    }

    render() {
        return React.createElement(
            'main', null,
            React.createElement(
                Pane, { id: 'common' },
                React.createElement(
                    PanelGroup, {
                        panels: [
                            {
                                name: 'console',
                                panelClass: ConsolePanel
                            },
                            {
                                name: 'figures',
                                panelClass: FiguresPanel
                            }
                        ],
                        activeTab: 'console'
                    }
                )
            ),
            React.createElement(
                Pane, { id: 'side' },
                React.createElement(
                    PanelGroup, {
                        panels: [
                            {
                                name: 'properties',
                                panelClass: PropertiesPanel
                            }
                        ],
                        activeTab: 'properties'
                    }
                )
            )
        );
    }
}

class ConsolePanel extends Panel {
    constructor(props) {
        super(props);
    }

    static title() {
        return 'Console';
    }
}

class FiguresPanel extends Panel {
    constructor(props) {
        super(props);
    }

    static title() {
        return 'Figures';
    }
}

class PropertiesPanel extends Panel {
    constructor(props) {
        super(props);
    }

    static title() {
        return 'Properties';
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow