Skip to content

Instantly share code, notes, and snippets.

@dounan
Last active November 1, 2017 23:10
Show Gist options
  • Save dounan/84ba03ea14a503a14abd16bf16221511 to your computer and use it in GitHub Desktop.
Save dounan/84ba03ea14a503a14abd16bf16221511 to your computer and use it in GitHub Desktop.
Callback within a render callback example
/*
https://cdb.reacttraining.com/use-a-render-prop-50de598f11ce
The render callbak examples in the blog post only pass data to the
render callback, and the render callback simply renders the data.
What if wanted to pass another callback as an argument to the render
callback? Does this pattern feel ok?
*/
type ToggleProps = {
items: [
{
render: (selected: boolean, onSelected: () => void) => React.Node,
}
],
};
type ToggleState = {
selectedIndex: number,
};
class Toggle extends React.Component<ToggleProps, ToggleState> {
state = {selectedIndex: -1};
render() {
const {selectedIndex} = this.state;
return (
<div>
{
this.props.items.map((item, i) => {
item.render(
selectedIndex === i,
() => this.setState({selectedIndex: i})
);
});
}
</div>
)
}
}
// ********************************
// Example usage of Toggle
class MyToggle extends React.Component {
render() {
return <Toggle items={this.items} />;
}
items = [
{
render: (selected, onSelected) => {
return (
<div className={selected ? "selected" : ""}>
<Button onClick={onSelected} />
</div>
);
}
},
{
render: (selected, onSelected) => {
return (
<div className={selected ? "selected" : ""}>
<Captcha onSolved={onSelected} />
</div>
);
}
}
];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment