2015-09-22 11 views
11

Jestem nowy w ReactJS i próbowałem swoich sił w prostym projekcie. Zasadniczo, fragment tworzy listę znajomych z tablicy i wyświetla całkowitą liczbę znajomych.Maksymalny stos połączeń przekroczył błąd w ReactJS. Czy ktoś może pomóc ci wyjaśnić, co się dzieje? (Snippet on JSFiddle)

Z jakiegoś powodu, zdałem sobie sprawę, funkcja incrementFriendsCount rzuca „Maximum stosu wywołań przekroczyła błąd” kiedy dodać nowego przyjaciela

Fragment kodu poniżej jest również available on 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: { 
 
    \t enemies: React.PropTypes.array.isRequired 
 
    }, 
 
    render: function() { 
 
    \t var allFriends = this.props.enemies.map(function(friend){ 
 
     \t 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>

będę wdzięczny, jeśli ktoś może rzucić więcej światła na to, dlaczego ten błąd jest generowany.

+0

To działa dobrze dla mnie. Jedyne ostrzeżenie, które widzę dotyczy "className" (zobacz: https://facebook.github.io/react/docs/jsx-in-depth.html#html-tags-vs.-react-components) – pmilla1606

Odpowiedz

18

Telefonujesz this.props.incCount w componentWillReceiveProps która określa stan elementu nadrzędnego i efekt będzie taki, że AddingTheFriend ponownie wygenerowana i this.props.incCount nazywa się ponownie. Stąd przepełnienie stosu.

Kolejna porada to taka, że ​​zazwyczaj chcesz być ostrożny i używać jak najmniejszej liczby elementów w jak najmniejszej liczbie elementów. Po prostu zwiększ liczbę znajomych, licząc w tym samym momencie, w którym konkludujesz nowego przyjaciela do stanu komponentu nadrzędnego.

Oto codepen - zdecydowanie lepiej niż JSFiddle w mojej opinii.

+0

Dzięki @romseguy. Twoje rozwiązanie działa dobrze. Zauważyłem refactor w kodzie bez this.ref. Rozumiem obecne rozwiązanie lepiej. Moim największym celem jest zredukowanie liczby wywołań setState, które wywołuję przed funkcją renderowania. – Olatoyosi

10

W przyszłości przez ludzi z tego samego wyjścia błędów podczas korzystania reagują: Błąd ten występuje również od uruchomienia aplikacji zarówno z

  • WebPACK-dev-serwer --hot
  • nowy webpack.HotModuleReplacementPlugin()

więc: po uruchomieniu serwera z --hot a także mają hotModuleReplacementPlugin włączone w Twojej WebPACK config potem dostanie się do sytuacji, że składniki będą rekurencyjnie Update, zatem genowej dokładnie ocenić komunikat o błędzie, o którym wspomniał OP.

Proste rozwiązanie: Pomiń jedną z dwóch rzeczy, np. pomiń "--hot", ponieważ już używasz wtyczki do tego.

0

W moim przypadku była to nieskończona pętla lub jeśli lubisz oczywisty błąd logiczny.

Powiązane problemy