React (Native) optimizations/performance

This commit is contained in:
Lyubo Marinov 2017-04-10 15:22:34 -05:00
parent b0d63dae16
commit 35ba6cef4e
1 changed files with 63 additions and 1 deletions

View File

@ -19,6 +19,68 @@ export default class Avatar extends Component {
uri: React.PropTypes.string uri: React.PropTypes.string
} }
/**
* Initializes a new Avatar instance.
*
* @param {Object} props - The read-only React Component props with which
* the new instance is to be initialized.
*/
constructor(props) {
super(props);
// Fork (in Facebook/React speak) the prop uri because Image will
// receive it through a source object. Additionally, other props may be
// forked as well.
this.componentWillReceiveProps(props);
}
/**
* Notifies this mounted React Component that it will receive new props.
* Forks (in Facebook/React speak) the prop {@code uri} because
* {@link Image} will receive it through a {@code source} object.
* Additionally, other props may be forked as well.
*
* @inheritdoc
* @param {Object} nextProps - The read-only React Component props that this
* instance will receive.
* @returns {void}
*/
componentWillReceiveProps(nextProps) {
// uri
const prevURI = this.props && this.props.uri;
const nextURI = nextProps && nextProps.uri;
let nextState;
if (prevURI !== nextURI || !this.state) {
nextState = {
...nextState,
/**
* The source of the {@link Image} which is the actual
* representation of this {@link Avatar}. As {@code Avatar}
* accepts a single URI and {@code Image} deals with a set of
* possibly multiple URIs, the state {@code source} was
* explicitly introduced in order to reduce unnecessary renders.
*
* @type {{
* uri: string
* }}
*/
source: {
uri: nextURI
}
};
}
if (nextState) {
if (this.state) {
this.setState(nextState);
} else {
this.state = nextState;
}
}
}
/** /**
* Implements React's {@link Component#render()}. * Implements React's {@link Component#render()}.
* *
@ -30,7 +92,7 @@ export default class Avatar extends Component {
// XXX Avatar is expected to display the whole image. // XXX Avatar is expected to display the whole image.
resizeMode = 'contain' resizeMode = 'contain'
source = {{ uri: this.props.uri }} source = { this.state.source }
style = { this.props.style } /> style = { this.props.style } />
); );
} }