React setState

0

Witam,
Mam problem z funkcją setState w React. W funkcji componentWillMount pobieram do state dwa razy dane. Niestety aby pobrać drugą daną muszę skorzystać z danej w state, która się nie zmienia po update. Jak mogę rozwiązać swój problem?

export class Blog extends React.Component {
  constructor(props){
    super(props);

    this.state = {
      name: props.match.params.blog,
      nick: '',
      last_modification: '',
      creation_date: '',
      blog_id: '',
      articles: [],
      blog_category_id: '',
      blog_category: ''
    }
  }

  componentWillMount(){
    Api.getBlogDetails(this, this.state.name);
    Api.getBlogArticles(this, this.state.blog_id);
  }
render(){
return(<div></div>);
}

API:

const getBlogDetails = function(obj, blog){
  axios.post(baseURL + '/index.php?/API/BlogController/getBlogDetails/', querystring.stringify({
    name: blog
  }))
  .then(response => {
    obj.id = response.data.results.blog_id
    obj.setState({
      nick: response.data.results.nick,
      name: response.data.results.name,
      last_modification: response.data.results.last_modification,
      creation_date: response.data.results.creation_date,
      blog_id: response.data.results.blog_id,
      blog_category_id: response.data.results.blog_category_id,
      blog_category: response.data.results.blogCategory
    } )
  }/*, () => {getBlogArticles(obj, response.data.results.blog_id)} */)
    .catch(error => {
      console.log(error);
    });
}

const getBlogArticles = function(obj, blog_id){
  apiClient().get('/index.php?/API/ArticleController/getArticles/' + blog_id)
  .then(response => { console.log(response.data.results)
    obj.setState({
      articles: response.data.results
    })
    })
    .catch(error => {
      console.log(error);
    });
}

Proszę o wyrozumiałość dopiero się uczę Reacta i JS.
Z góry dziękuje za pomoc :)

1

Wywołaj drugiego promisa z wynikiem z pierwszego, bez udziału state'a. A tak w ogóle to nie powinieneś prekazywać kontekstu komponentu do funkcji pobierających dane - niech zwracają one wartości (jako promisy oczywiście), a resztę rób bezpośrednio w componentWillMount.

0
Maciej Cąderek napisał(a):

Wywołaj drugiego promisa z wynikiem z pierwszego, bez udziału state'a. A tak w ogóle to nie powinieneś prekazywać kontekstu komponentu do funkcji pobierających dane - niech zwracają one wartości (jako promisy oczywiście), a resztę rób bezpośrednio w componentWillMount.

  componentWillMount(){
    const blogDetails = Api.getBlogDetails(this.state.name);
    blogDetails.then(function(response) {
      this.setState({
        nick: response.data.results.nick,
        name: response.data.results.name,
        last_modification: response.data.results.last_modification,
        creation_date: response.data.results.creation_date,
        blog_id: response.data.results.blog_id,
        blog_category_id: response.data.results.blog_category_id,
        blog_category: response.data.results.blogCategory
      })
      Api.getBlogArticles(this, response.data.results.blog_id);
    }.bind(this))
  }

Pewnie nie do końca o to chodziło ale dla mnie wystarczy, że działa.
Dzięki wielkie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1