Skip to content

Instantly share code, notes, and snippets.

@mjackson
Created June 3, 2016 18:39
Show Gist options
  • Select an option

  • Save mjackson/170c135e20c5c779a0514c45b3fa1914 to your computer and use it in GitHub Desktop.

Select an option

Save mjackson/170c135e20c5c779a0514c45b3fa1914 to your computer and use it in GitHub Desktop.
React error message singleton (using portals)
import React from 'react'
import { render, unmountComponentAtNode } from 'react-dom'
const ErrorMessage = React.createClass({
statics: {
outletNode: null
},
propTypes: {
message: React.PropTypes.string
},
componentDidMount() {
if (ErrorMessage.outletNode == null) {
ErrorMessage.outletNode = document.createElement('div')
document.body.appendChild(ErrorMessage.outletNode)
}
this.updateMessage()
},
componentDidUpdate() {
this.updateMessage()
},
updateMessage() {
const { message } = this.props
if (message) {
render(
<p className="error-message">{message}</p>,
ErrorMessage.outletNode
)
} else {
unmountComponentAtNode(ErrorMessage.outletNode)
}
},
componentWillUnmount() {
unmountComponentAtNode(ErrorMessage.outletNode)
},
render() {
return null
}
})
const ErrorToggler = React.createClass({
getInitialState() {
return {
errorMessage: null
}
},
render() {
const { errorMessage } = this.state
return (
<div>
<button onClick={() => this.setState({ errorMessage: this.props.showMessage })}>boom!</button>
<button onClick={() => this.setState({ errorMessage: null })}>ok</button>
<ErrorMessage message={errorMessage}/>
</div>
)
}
})
render((
<div>
<ErrorToggler showMessage="boom1"/>
<ErrorToggler showMessage="boom2"/>
</div>
), document.getElementById('app'))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment