Skip to content

Instantly share code, notes, and snippets.

@acro5piano
Last active August 25, 2018 00:29
Show Gist options
  • Save acro5piano/4945264cfb0a83b681822332ef351ece to your computer and use it in GitHub Desktop.
Save acro5piano/4945264cfb0a83b681822332ef351ece to your computer and use it in GitHub Desktop.
Example: A directory tree component
// pseudo api
const getDirectories = async () => {
return [
{ itemName: 'file 1', type: 'file' },
{ itemName: 'folder 1', type: 'directory', nodes: [ { itemName: 'file 1', type: 'file' } ] },
]
}
export class TreeNode extends React.Component {
state = {
open: false,
}
openSubtree = () => this.setState({ open: true })
closeSubtree = () => this.setState({ open: false })
render() {
const { open } = this.state
const { node } = this.props
if (node.type === 'file'){
return <div>{node.itemName}</div>
}
if (!open) {
return <div onClick={this.openSubtree}>{node.itemName}</div>
}
return (
<div>
<div onClick={this.closeSubtree>{node.itemName}</div>
{node.nodes.map(node => <TreeNode node={node.nodes} />)}
</div>
)
}
}
export class Tree extends React.Component {
state = {
nodes: [],
}
async componentDidMount() {
const nodes = await getDirectories()
this.setState({ nodes })
}
render() {
return (
<div>
{this.state.nodes.map(node => <TreeNode node={node} />)
</div>
)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment