--- title: React Component with Dot Notation date: 2019-02-19 11:45:47 +07:00 tags: [react, javascript, dot-notation] layout: post thumbnail: https://media.giphy.com/media/dIxkmtCuuBQuM9Ux1E/200w_d.gif --- This is my answer to someone’s question on [StackOverflow](https://stackoverflow.com/questions/49256472/react-how-to-extend-a-component-that-has-child-components-and-keep-them/49258038#answer-49258038). How can we define a React component that is accessible through the dot notation? Take a look at the following code. We have the ```Menu``` component and its three children ```Menu.Item:``` const App = () => ( Home Blog About ); How can we define a component like ```Menu```? Where it has some kind of “sub-component” that is accessible through a dot notation. Well, it’s actually a pretty common pattern. And it’s not really a sub-component, it’s just another component being attached to another one. Let’s use the above ```Menu```component for example. We’ll put this component to its own dedicated file: ```menu.js```. First, let’s define these two components separately on this module file: // menu.js import React from 'react'; export const MenuItem = ({ children }) =>
  • {children}
  • ; export default const Menu = ({ children }) => ; It’s just a simple functional component. The ```Menu``` is the parent with ```ul``` tag. And the ```MenuItem``` will act as its children. Now we can use these two components like so: import React from 'react'; import { render } from 'react-dom'; import Menu, { MenuItem } from './menu'; const App = () => ( Home Blog About ); render(, document.getElementById('root')); Where’s the dot notation? To make our MenuItem component accessible through the dot nation, we can simply attach it to the Menu component as a static property. To do so, we can no longer use the functional component for Menu and switch to the class component instead: // menu.js import React, { Component } from 'react'; export default const MenuItem = ({ children }) =>
  • {children}
  • ; export default class Menu extends Component { static Item = MenuItem; render() { return ( ); } } Now we can use the dot notation to declare the ```MenuItem``` component: import React from 'react'; import { render } from 'react-dom'; import Menu from './menu'; const App = () => ( Home Blog About ); render(, document.getElementById('root')); You can also put the ```MenuItem``` component definition directly within the ```Menu``` class. But this way you can no longer import ```MenuItem``` individually. import React, { Component } from 'react'; export default class Menu extends Component { static Item = ({ children }) =>
  • {children}
  • ; render() { return ( ); } } **For demo purpose**, Originally published at .