forked from cybrespace/mastodon
		
	Improve shouldComponentUpdate for status and status_action_bar (#3323)
This commit is contained in:
		
							parent
							
								
									7c67cb5997
								
							
						
					
					
						commit
						b00cb2aed3
					
				
					 2 changed files with 39 additions and 9 deletions
				
			
		| 
						 | 
				
			
			@ -44,6 +44,35 @@ class Status extends ImmutablePureComponent {
 | 
			
		|||
    isHidden: false,
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Avoid checking props that are functions (and whose equality will always
 | 
			
		||||
  // evaluate to false. See react-immutable-pure-component for usage.
 | 
			
		||||
  updateOnProps = [
 | 
			
		||||
    'status',
 | 
			
		||||
    'account',
 | 
			
		||||
    'wrapped',
 | 
			
		||||
    'me',
 | 
			
		||||
    'boostModal',
 | 
			
		||||
    'autoPlayGif',
 | 
			
		||||
    'muted',
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
  updateOnStates = []
 | 
			
		||||
 | 
			
		||||
  shouldComponentUpdate (nextProps, nextState) {
 | 
			
		||||
    if (nextProps.isIntersecting === false && nextState.isHidden) {
 | 
			
		||||
      // It's only if we're not intersecting (i.e. offscreen) and isHidden is true
 | 
			
		||||
      // that either "isIntersecting" or "isHidden" matter, and then they're
 | 
			
		||||
      // the only things that matter.
 | 
			
		||||
      return this.props.isIntersecting !== false || !this.state.isHidden;
 | 
			
		||||
    } else if (nextProps.isIntersecting !== false && this.props.isIntersecting === false) {
 | 
			
		||||
      // If we're going from a non-intersecting state to an intersecting state,
 | 
			
		||||
      // (i.e. offscreen to onscreen), then we definitely need to re-render
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
    // Otherwise, diff based on "updateOnProps" and "updateOnStates"
 | 
			
		||||
    return super.shouldComponentUpdate(nextProps, nextState);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  componentWillReceiveProps (nextProps) {
 | 
			
		||||
    if (nextProps.isIntersecting === false && this.props.isIntersecting !== false) {
 | 
			
		||||
      requestIdleCallback(() => this.setState({ isHidden: true }));
 | 
			
		||||
| 
						 | 
				
			
			@ -52,14 +81,6 @@ class Status extends ImmutablePureComponent {
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  shouldComponentUpdate (nextProps, nextState) {
 | 
			
		||||
    if (nextProps.isIntersecting === false && this.props.isIntersecting !== false) {
 | 
			
		||||
      return nextState.isHidden;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  handleRef = (node) => {
 | 
			
		||||
    if (this.props.onRef) {
 | 
			
		||||
      this.props.onRef(node);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@ import PropTypes from 'prop-types';
 | 
			
		|||
import IconButton from './icon_button';
 | 
			
		||||
import DropdownMenu from './dropdown_menu';
 | 
			
		||||
import { defineMessages, injectIntl } from 'react-intl';
 | 
			
		||||
import ImmutablePureComponent from 'react-immutable-pure-component';
 | 
			
		||||
 | 
			
		||||
const messages = defineMessages({
 | 
			
		||||
  delete: { id: 'status.delete', defaultMessage: 'Delete' },
 | 
			
		||||
| 
						 | 
				
			
			@ -21,7 +22,7 @@ const messages = defineMessages({
 | 
			
		|||
  unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
class StatusActionBar extends React.PureComponent {
 | 
			
		||||
class StatusActionBar extends ImmutablePureComponent {
 | 
			
		||||
 | 
			
		||||
  static contextTypes = {
 | 
			
		||||
    router: PropTypes.object,
 | 
			
		||||
| 
						 | 
				
			
			@ -43,6 +44,14 @@ class StatusActionBar extends React.PureComponent {
 | 
			
		|||
    intl: PropTypes.object.isRequired,
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  // Avoid checking props that are functions (and whose equality will always
 | 
			
		||||
  // evaluate to false. See react-immutable-pure-component for usage.
 | 
			
		||||
  updateOnProps = [
 | 
			
		||||
    'status',
 | 
			
		||||
    'me',
 | 
			
		||||
    'withDismiss',
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
  handleReplyClick = () => {
 | 
			
		||||
    this.props.onReply(this.props.status, this.context.router);
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue