React
Användargränssnittslösningar
Sök…
Introduktion
Låt oss säga att vi inspireras av några idéer från moderna användargränssnitt som används i program och konverterar dem till React-komponenter. Det är vad " Användargränssnittslösningar " ämnet består av. Tillskrivningen bedöms.
Grundläggande ruta
import React from 'react';
class Pane extends React.Component {
constructor(props) {
super(props);
}
render() {
return React.createElement(
'section', this.props
);
}
}
Panel
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 '';
}
}
Viktiga skillnader från enkel ruta är:
- panelen har fokus i exempelvis när den kallas med skript eller klickas med musen;
- panelen har
title
statiska metoden per komponent, så det kan förlängas med andra panelen komponent med åsidotitle
(orsak här är att funktionen kan sedan kallas igen på rendering för lokaliseringsändamål, men i gränserna för detta exempeltitle
inte vettigt) ; - Det kan innehålla enskilda formatmall som deklarerats i statisk
css
metod (du kanPANEL.css
innehållet frånPANEL.css
).
Flik
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
egenskapen i Tab
instansen måste innehålla en klass av panelen som används för beskrivning.
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();
}
}
panels
egendom PanelGroup
instans måste innehålla array med objekt. Varje objekt där förklarar viktig information om paneler:
-
name
- identifierare av panelen som används av kontrollskriptet; -
class
- panelens klass.
Glöm inte att ställa in egenskapen activeTab
till namnet på önskad flik.
Klargörande
När fliken är nere, får den nödvändiga panelen klassnamnet active
på DOM-elementet (betyder att det kommer att bli synligt) och det är fokuserat nu.
Exempelvy med "PanelGroup"
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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow