DEV Community

Discussion on: Hoverable Component with Render Props

Collapse
 
patroza profile image
Patrick Roza • Edited

With typescript you could change the definition of the children prop type, or cast props to any before accessing children.

I would suggest to move the mouseEnter and Leave call backs to properties of the class so that you dont re create the functions every render pass

Collapse
 
ruiclarateixeira profile image
Rui Teixeira • Edited

Thanks for the tips!

For the ts children definition - what would it look like? The code below still complains that children is not a function. CodeSandbox

interface HoverableProps {
  children(hovered: boolean): React.ReactNode;
}

class Hoverable extends React.Component<HoverableProps> {
  state = { hovered: false };
  render() {
    return (
      <div
        onMouseEnter={() => this.setState({ hovered: true })}
        onMouseLeave={() => this.setState({ hovered: false })}
      >
        {this.props.children(this.state.hovered)}
      </div>
    );
  }
}
Collapse
 
ruiclarateixeira profile image
Rui Teixeira

Actually once I updated the usage to use children there's no longer errors.

    <Hoverable>{hovered => <div>{hovered ? "🔥" : "🦄"}</div>}</Hoverable>

That's awesome! thanks!

Thread Thread
 
patroza profile image
Patrick Roza

Sure, no worries.
I think the more correct would be:
children: (hovered: boolean) => void

As this implies a property with function signature instead of a method.

Thread Thread
 
ruiclarateixeira profile image
Rui Teixeira

What is the difference between having it as a method or a property with function signature?