React (Native) optimizations/performance
This commit is contained in:
parent
b0d63dae16
commit
35ba6cef4e
|
@ -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 } />
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue