From 556913eec0fd63404f45a90764d05b494f29c988 Mon Sep 17 00:00:00 2001 From: Brendan Abbott Date: Fri, 2 Jun 2017 00:20:42 +1000 Subject: [PATCH 1/2] Migrate to pure components where possible, implement shouldComponentUpdate where possible --- package.json | 1 + src/components/BodyContent/BodyContent.js | 4 ---- src/components/BodySchema/BodySchema.js | 7 +++++-- .../ContentContainer/ContentContainer.js | 4 ++-- src/components/CopyButton/CopyButton.js | 10 ++-------- src/components/Description/Description.js | 4 ++-- src/components/Header/Header.js | 5 +++-- src/components/Indicator/Indicator.js | 4 ++-- src/components/Method/Method.js | 20 +++++-------------- src/components/Navigation/Navigation.js | 8 ++++++++ .../NavigationMethod/NavigationMethod.js | 4 ++-- src/components/NavigationTag/NavigationTag.js | 7 +++++++ src/components/Page/Page.js | 18 +++++++---------- src/components/Property/Property.js | 4 ++-- src/components/Response/Response.js | 4 ++-- .../ServiceContainer/ServiceContainer.js | 7 +++---- yarn.lock | 7 +++++++ 17 files changed, 60 insertions(+), 58 deletions(-) diff --git a/package.json b/package.json index 5f9f9e4..2da0a85 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "jest": "^20.0.4", "json-loader": "^0.5.4", "node-sass": "^4.5.1", + "react-addons-perf": "^15.4.2", "react-test-renderer": "^15.5.4", "sass-loader": "^6.0.3", "style-loader": "^0.16.0", diff --git a/src/components/BodyContent/BodyContent.js b/src/components/BodyContent/BodyContent.js index 8e59f3b..1131af2 100644 --- a/src/components/BodyContent/BodyContent.js +++ b/src/components/BodyContent/BodyContent.js @@ -11,10 +11,6 @@ export default class BodyContent extends Component { constructor (props) { super(props) - this.renderTabs = this.renderTabs.bind(this) - this.renderSchema = this.renderSchema.bind(this) - this.renderExamples = this.renderExamples.bind(this) - this.state = { tab: 'schema' } diff --git a/src/components/BodySchema/BodySchema.js b/src/components/BodySchema/BodySchema.js index 15dd8a9..2ca50e4 100644 --- a/src/components/BodySchema/BodySchema.js +++ b/src/components/BodySchema/BodySchema.js @@ -2,6 +2,7 @@ import React, { Component } from 'react' import createFragment from 'react-addons-create-fragment' import classNames from 'classnames' import PropTypes from 'prop-types' +import isEqual from 'lodash/isEqual' import Property from '../Property/Property' @@ -11,8 +12,6 @@ export default class BodySchema extends Component { constructor (props) { super(props) - this.renderPropertyRow = this.renderPropertyRow.bind(this) - this.renderSubsetProperties = this.renderSubsetProperties.bind(this) this.onClick = this.onClick.bind(this) this.state = { @@ -20,6 +19,10 @@ export default class BodySchema extends Component { } } + shouldComponentUpdate (nextProps, nextState) { + return !isEqual(nextState.expandedProp, this.state.expandedProp) + } + render () { const { properties, styleVariation } = this.props diff --git a/src/components/ContentContainer/ContentContainer.js b/src/components/ContentContainer/ContentContainer.js index 2a31ce7..ec5123b 100644 --- a/src/components/ContentContainer/ContentContainer.js +++ b/src/components/ContentContainer/ContentContainer.js @@ -1,9 +1,9 @@ -import React, { Component } from 'react' +import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import './ContentContainer.scss' -export default class ContentContainer extends Component { +export default class ContentContainer extends PureComponent { render () { return (
diff --git a/src/components/CopyButton/CopyButton.js b/src/components/CopyButton/CopyButton.js index 78cd3c2..a97657a 100644 --- a/src/components/CopyButton/CopyButton.js +++ b/src/components/CopyButton/CopyButton.js @@ -27,19 +27,13 @@ export default class CopyButton extends Component { } onClick (e) { - this.setState({ - ...this.state, - tooltip: 'Copied' - }) + this.setState({ tooltip: 'Copied' }) this.props.onCopyClick(e) } onMouseOver (e) { - this.setState({ - ...this.state, - tooltip: this.props.tooltip - }) + this.setState({ tooltip: this.props.tooltip }) } } diff --git a/src/components/Description/Description.js b/src/components/Description/Description.js index 0580efa..c9d6f34 100644 --- a/src/components/Description/Description.js +++ b/src/components/Description/Description.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react' +import React, { PureComponent } from 'react' import classNames from 'classnames' import markdown from 'markdown-it' import PropTypes from 'prop-types' @@ -6,7 +6,7 @@ import './Description.scss' const cm = markdown('commonmark') -export default class Description extends Component { +export default class Description extends PureComponent { render () { const { isInline, description } = this.props const text = { diff --git a/src/components/Header/Header.js b/src/components/Header/Header.js index 49b4292..82fa07a 100644 --- a/src/components/Header/Header.js +++ b/src/components/Header/Header.js @@ -1,12 +1,13 @@ -import React, { Component } from 'react' +import React, { PureComponent } from 'react' import PropTypes from 'prop-types' import Description from '../Description/Description' import './Header.scss' -export default class Header extends Component { +export default class Header extends PureComponent { render () { const { title, description, version } = this.props + return (