Подтвердить что ты не робот

Максимальная сумма вызовов превысила ошибку в ReactJS. Может кто-нибудь объяснить, что происходит? (Фрагмент на JSFiddle)

Я новичок в ReactJS и пытался пробовать простой проект. В принципе, фрагмент создает список друзей из массива и отображает общее количество друзей.

По какой-то причине я понял, что функция incrementFriendsCount генерирует "Максимальный стек вызовов превышен" при добавлении нового друга

Ниже приведен фрагмент кода доступный в JSFiddle.

var HelloUser = React.createClass({
  getInitialState: function() {
    return {
      name: "Toyosi",
      friends: ["Susanna", "Jibola", "Worreva"],
      friendsCount: 0
    }
  },
  addFriends: function(friend) {
    this.setState({
      friends: this.state.friends.concat([friend])
    });
  },
  componentWillMount: function() {
    this.setState({
      friendsCount: this.state.friends.length
    });
  },
  incrementFriendsCount: function() {
    this.setState({
      friendsCount: this.state.friends.length
    });
  },
  render: function() {
    return ( < div >
      Villain: {
        this.state.name
      }, No of friends: {
        this.state.friendsCount
      } < br / >
      < AddingTheFriend addNew = {
        this.addFriends
      }
      incCount = {
        this.incrementFriendsCount
      }
      />
        <ListFriends enemies={this.state.friends} / >
      < /div>
    );
  }
});

var ListFriends = React.createClass({
    propTypes: {
    	enemies: React.PropTypes.array.isRequired
    },
    render: function() {
    	var allFriends = this.props.enemies.map(function(friend){
        	return <li>{friend}</li > ;
    });

  return ( < div > Her evil friends:
    < ul > {
      allFriends
    } < /ul>
            </div >
  )
}
});

var AddingTheFriend = React.createClass({
      getInitialState: function() {
        return {
          newFriend: ''
        }
      },
      propTypes: {
        addNew: React.PropTypes.func.isRequired
      },
      updateNewFriend: function(change) {
        this.setState({
          newFriend: change.target.value
        });
      },
      addTheFriend: function() {
        this.props.addNew(this.state.newFriend);
        this.setState({
          newFriend: ''
        })
      },
      componentWillReceiveProps: function() {
        this.props.incCount();
      },
      render: function() {
          return ( < div >
            < input type = "text"
            value = {
              this.state.newFriend
            }
            onChange = {
              this.updateNewFriend
            }
            />
                <button type="button" onClick={this.addTheFriend}>Add Friend</button >
            < /div>
        )
    }
});
React.render(<HelloUser / > , document.getElementById('app'));
<script src="http://fb.me/react-js-fiddle-integration.js"></script>

<div id="app"></div>
4b9b3361

Ответ 1

Вы вызываете this.props.incCount в componentWillReceiveProps, который устанавливает состояние родительского компонента, и эффект будет таким, что AddingTheFriend будет снова отображен, а this.props.incCount вызывается снова. Следовательно, переполнение стека.

Другим советом будет то, что в целом вы хотите быть осторожным и использовать setState как можно меньше, как можно меньше компонентов. Просто увеличивайте количество друзей, одновременно добавляя нового друга в состояние родительского компонента.

Здесь codepen - намного лучше, чем JSFiddle, на мой взгляд.

Ответ 2

Как будущая ссылка для людей с одинаковым результатом ошибки при использовании реакции: Эта ошибка также будет связана с тем, что вы запускаете приложение с помощью

  • webpack-dev-server --hot
  • новый webpack.HotModuleReplacementPlugin()

Итак: когда вы запускаете сервер с -hot, а также включаете hotModuleReplacementPlugin в своей конфигурации webpack, вы попадаете в ситуацию, когда ваши компоненты будут рекурсивно обновляться, тем самым генерируя именно сообщение об ошибке, о котором упомянул OP.

Простое решение: опустите одну из двух вещей, например. опустите "-hot", поскольку вы уже используете для этого плагин.

Ответ 3

В моем случае это был бесконечный цикл, или если вам нужна очевидная логическая ошибка.