JSFiddle - React, Tailwind, and code Playground

by f0084rrrr

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.4.2/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.5.0/umd/react-dom.production.min.js"></script>

CSS

span.tab {
	margin-right: 10px;
	padding: 5px;
}

span.selected {
	color: red;
	text-decoration: underline;
	background-color: #DDDDDD;
}

div.tabs-row {
	margin-bottom: 5px;
}

div.tab-content {
	padding: 10px;
	background-color: #DDDDDD;
}

JavaScript 1.7

import React from 'react';
import ReactDOM from 'react-dom';

var App = React.createClass({
	getInitialState: function() {
		return {
			itemsQuantity: 10 
		};
	},

	handleChange: function(event) {
		this.setState({
			itemsQuantity: Math.max(parseInt(event.target.value), 1)
		});
	},

	render: function() {
		var generateItems = function(parentName) {
			var items = {};
			var itemName;
			var key;
			for(var i=1; i<this.state.itemsQuantity + 1; i++) {
				itemName = "Child of " + parentName + " #" + i;
				key = ["k" + i];
				items[key] = <Item key={key} name={itemName}/>;
			}
			return items;
		}.bind(this);

		return (
			<div>
				<strong>Items Quantity: </strong><input type="number" value={this.state.itemsQuantity} onChange={this.handleChange}/>
				<hr/>
				<Group>
					<Tab key="A" name="Tab A">{generateItems("A")}</Tab>
					<Tab key="B" name="Tab B">{generateItems("B")}</Tab>
					<Tab key="C" name="Tab C">{generateItems("C")}</Tab>
				</Group>
			</div>
		);
	}
});

var Group = React.createClass({
	getInitialState: function() {
		return {
			selectedTab: this.props.children[0]
		};
	},

	selectTab: function(tab) {
		this.setState({
			selectedTab: tab
		});
	},

	render: function() {
		var selectedTab = this.state.selectedTab;
		var newSelectedTab;
		var selectedTabName = "None";
		var tabs = [];
		var tabItems = [];
		var selectedKey = (this.state.selectedTab && this.state.selectedTab.props.key);
		var isSelected;

		tabs = React.Children.map(this.props.children, function(tab, i) {
			isSelected = tab.props.key === selectedKey;
			if (isSelected) {
				newSelectedTab = tab;
			}
			return React.addons.cloneWithProps(tab, {
				isSelected: isSelected,
				selectTab: this.selectTab,
				key: tab.props.key
			});
		}, this);

		tabItems = (newSelectedTab && newSelectedTab.props.children) || [];

		return (
			<div>
				<div className="tabs-row">{tabs}</div>
				<div className="tab-content">{tabItems}</div>
			</div>
		);
	}

});

var Tab =...