Компонент рендеринга не обновляется после установки - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть такой компонент:

... imports

class ChooseGenres extends Component {

    constructor(props) {
        super(props);

        this.setState({
            event: { ... , genres: [] },
            genres: [{...}, {...}, {...}]
        });
    }

    eventHasGenre(item, genre_id) {
        return item.genres.indexOf(genre_id) > -1 ? true : false;
    }

    onGenreChange(genre_id) {
        let event = this.state.event;

        if (this.eventHasGenre(event, genre_id)) {
            event.genres.splice(indexOf, 1)
        } else {
            event.genres.push(genre_id);
        }

        this.setState({
            event: event
        });
    }

    render() {
        return (
            <Container>
                <Content>
                    <List dataArray={this.state.genres}
                        renderRow={(item) =>
                            <ListItem onPress={this.onGenreChange.bind(this, item.id)}>
                                <Body>
                                    <Text>{item.name}</Text>
                                </Body>
                                {this.eventHasGenre(this.state.event, item.id) &&
                                    <Right>
                                        <Icon active name="arrow-forward" />
                                    </Right>
                                }
                            </ListItem>
                        }>
                    </List>
                </Content>
            </Container>
}

ChooseGenres.propTypes = {
    isLoggedIn: PropTypes.bool.isRequired,
}

const mapStateToProps = (state) => {
    return {
        isLoggedIn: state.isLoggedIn
    };
};

const mapDispatchToProps = (dispatch) => ({
    startup: () => dispatch(StartupActions.startup())
});

export default connect(mapStateToProps, mapDispatchToProps)(ChooseGenres);

Когда я нажимаю на ListItem, я добавляю жанр в массив event.genres и хочу, чтобы значок отображался.
Но даже еслиобъект события в состоянии обновлен правильно (я регистрирую это в консоли), Значок все еще не показан.

Странное поведение, которое я заметил, это то, что если я вернулся в навигацию и вернулся к этому компоненту, значки отображаются правильно.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Прежде всего вам не нужно делать setState в конструкторе, так как он бесполезен, так как компонент не был обработан

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

state = {
  genres: [{id: 1, name: 1}, {id: 2, name: 2}, {id: 3, name: 3}]
}



onGenreChange = (id) => {
    const genres = this.state.genres.map(genre => {
      if (genre.id === id) {
        return {...genre, active: !genre.active}
      }
      return genre
    })
    this.setState({
      genres
    });
  }

<List dataArray={this.state.genres}
      renderRow={(item) =>
        <ListItem onPress={() => this.onGenreChange(item.id)}>
          <Body>
            <Text>{item.name}</Text>
           </Body>
           {item.active &&
             <Right>
               <Icon active name="arrow-forward" size={20} color={'red'}/>
              </Right>
           }
         </ListItem>
        }>
</List>
0 голосов
/ 14 сентября 2018

Вы визуализируете:

this.state.genres

, но устанавливаете состояние:

this.state.event.genres

Попробуйте обновить функцию рендеринга следующим образом:

render() {
    return (
        <Container>
            <Content>
                <List dataArray={this.state.event.genres}
                    renderRow={(item) =>
                        <ListItem onPress={this.onGenreChange.bind(this, item.id)}>
                            <Body>
                                <Text>{item.name}</Text>
                            </Body>
                            {this.eventHasGenre(this.state.event, item.id) &&
                                <Right>
                                    <Icon active name="arrow-forward" />
                                </Right>
                            }
                        </ListItem>
                    }>
                </List>
            </Content>
        </Container>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...