Skip to content

Instantly share code, notes, and snippets.

@jeremyckahn
Created October 31, 2017 19:02
Show Gist options
  • Select an option

  • Save jeremyckahn/eae00ac2dd623af740c3306466ee6d38 to your computer and use it in GitHub Desktop.

Select an option

Save jeremyckahn/eae00ac2dd623af740c3306466ee6d38 to your computer and use it in GitHub Desktop.
Playing with React
<div id="app">
{
"a": 1,
"b": 2,
"c": {
"d": 3,
"e": {
"f": 4,
"g": [
5,
6,
7
],
"h": null
}
}
}
</div>
const clone = obj => JSON.parse(JSON.stringify(obj));
const List = listData => listData.map(
(item, i) => <li key={String(i)}><Value rawData={item}/></li>
);
const Value = ({ rawData }) =>
Array.isArray(rawData) ?
<ol>{List(rawData)}</ol> :
typeof rawData === 'object' && rawData !== null ?
<DataList data={rawData} /> :
<span>{String(rawData)}</span>
;
const DataList = props => <dl>
{Object.keys(props.data).map(
objKey => ([
<dt>{objKey}:</dt>,
<dd><Value
rawData={props.data[objKey]}
/></dd>
])
)}
</dl>;
class App extends React.Component {
constructor (props) {
super(props);
this.state = {
cleanData: clone(props.data),
dirtyData: JSON.stringify(props.data, null, 2),
isClean: true
};
this.handleTextareaChange = this.handleTextareaChange.bind(this);
}
handleTextareaChange (e) {
let cleanData;
let isClean = true
const { value: dirtyData } = e.target;
this.setState({ dirtyData });
try {
cleanData = JSON.parse(dirtyData);
} catch (e) {
cleanData = this.state.cleanData;
isClean = false;
}
this.setState({ cleanData, isClean });
}
render () {
return <div>
<textarea
value={this.state.dirtyData}
onChange={this.handleTextareaChange}
className={this.state.isClean ? 'clean' : ''}
/>
<DataList data={this.state.cleanData} />
</div>;
}
}
const el = document.getElementById('app');
ReactDOM.render(
<App data={JSON.parse(el.innerText)} />,
el
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react-dom.js"></script>
$hover-color: #f902;
dl {
background: rgba(255, 255, 128, 0.1);
&:hover {
background: $hover-color;
}
}
dt {
border-top: solid 2px #f00;
font-weight: bold;
}
dd {
border-left: solid 2px #f90;
&:hover {
background: $hover-color;
}
}
textarea {
background: pink;
height: 250px;
width: 300px;
font-family: monospace;
&.clean {
background: palegreen;
}
}
ol {
font-weight: bold;
li {
&:hover {
background: $hover-color;
}
}
span {
font-weight: normal;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment