title: this.props equal to nextProps componentShouldUpdate
body: <p>Consider the following scenario:</p>
  
  <pre><code>import React, { Component } from 'react';
  import LocaleStringsService from '../Services/LocaleStringsService.js';
  import LocaleStringsList from '../Components/LocaleStringsList.js';
  
  class Translate extends Component
  {
      constructor(props) {
          super(props);
  
          this.state = {
              strings: []
          }
  
          this.firstRender = true;
          this.stringsService = new LocaleStringsService();
  
          console.log('constructor');
      }
  
      fetchStrings() {
          const { match: { params }} = this.props;
          const that = this;
  
          console.log('fetchStrings() for locale ', params.locale);
  
          const strings = this.stringsService.fetchForLocale(params.locale)
              .then(function (results) {
                  that.setState({ strings: results });
                  console.log('ASYNC fetchStrings().stringsService found some strings', results);
              })
              .catch(function () {
                  that.setState({ strings: [] });
                  console.log('ASYNC fetchStrings().stringsService ERROR CATCHED! emptyin\' strings');
              });
  
          console.log('fetchStrings() for locale DONE', params.locale);
      }
  
      componentWillUpdate(nextProps, nextState) {
          console.log('componentWillUpdate()');
  
          this.fetchStrings();
      }
  
      shouldComponentUpdate(nextProps, nextState) {
          console.log('shouldComponentUpdate()');
          console.log('shouldComponentUpdate() current locale:', this.props.match.params.locale);
          console.log('shouldComponentUpdate() next locale', nextProps.match.params.locale);
          if (this.firstRender) {
              console.log('shouldComponentUpdate() firstRender = false');
              this.firstRender = false;
              return true;
          }
          if (this.props.match.params.locale === nextProps.match.params.locale) {
              console.log('shouldComponentUpdate() SHOULD NOT UPDATE BECAUSE LOCALES MATCH');
              return false;
          }
  
          return true;
      }
  
      componentDidMount() {
          console.log('componentDidMount()');
  
          this.fetchStrings();
      }
  
    render () {
      console.log('render() RENDERING...');
        return (
           &lt;LocaleStringsList strings={this.state.strings} /&gt;
        );
    }
  }
  
  export default Translate;
  </code></pre>
  
  <p>The issue is that <code>shouldComponentUpdate()</code> does not allow me to compare <code>this.props</code> to <code>nextProps</code> because the two values ALWAYS match.</p>
  
  <p>You can also see that for some reason the AJAX request is triggered twice because the first request performs a setState, which triggers another update. </p>
  
  <p>This is the console.log of what happens:</p>
  
  <pre><code>constructor
  render() RENDERING...
  componentDidMount()
  fetchStrings() for locale  it_IT
  fetchStrings() for locale DONE it_IT
  shouldComponentUpdate()
  shouldComponentUpdate() current locale: it_IT
  shouldComponentUpdate() next locale it_IT
  shouldComponentUpdate() firstRender = false
  componentWillUpdate()
  fetchStrings() for locale  it_IT
  fetchStrings() for locale DONE it_IT
  render() RENDERING...
  ASYNC fetchStrings().stringsService found some strings [LocaleString]
  shouldComponentUpdate()
  shouldComponentUpdate() current locale: it_IT
  shouldComponentUpdate() next locale it_IT
  shouldComponentUpdate() SHOULD NOT UPDATE BECAUSE LOCALES MATCH
  ASYNC fetchStrings().stringsService found some strings [LocaleString]
  </code></pre>
  
  <p>The entire system depends on shouldComponentUpdate() to tell the component if data should be fetched again. Params only change when the same route is being accessed, but with different params (in my case, different locales, same page).</p>
  
  <p>Since I am not able to do that, requests always fail after the first render (a workaround I've implemented to make sure that AT LEAST the first run always goes through, because you can see in the console that the params match, even though the first run should have had the param as NULL or something different).</p>