Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 设置状态后渲染组件不更新_Javascript_Reactjs_React Native_State_Render - Fatal编程技术网

Javascript 设置状态后渲染组件不更新

Javascript 设置状态后渲染组件不更新,javascript,reactjs,react-native,state,render,Javascript,Reactjs,React Native,State,Render,我有这样一个组件: ... imports class ChooseGenres extends Component { constructor(props) { super(props); this.setState({ event: { ... , genres: [] }, genres: [{...}, {...}, {...}] }); } eventHasG

我有这样一个组件:

... 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);
。。。进口
类ChooseGenres扩展组件{
建造师(道具){
超级(道具);
这是我的国家({
事件:{…,类型:[]},
体裁:[{…},{…},{…}]
});
}
EventHasGene(项目、类型\u id){
返回item.genres.indexOf(genre_id)>-1?true:false;
}
onGenreChange(类型识别){
让event=this.state.event;
if(this.eventhasgree(event,genre_id)){
事件类型拼接(indexOf,1)
}否则{
事件类型推送(类型id);
}
这是我的国家({
事件:事件
});
}
render(){
返回(
{item.name}
{this.eventhasgreen(this.state.event,item.id)&&
}
}>
}
ChooseGenres.propTypes={
isLoggedIn:PropTypes.bool.isRequired,
}
常量mapStateToProps=(状态)=>{
返回{
isLoggedIn:state.isLoggedIn
};
};
const mapDispatchToProps=(调度)=>({
启动:()=>调度(StartupActions.startup())
});
导出默认连接(mapStateToProps、mapDispatchToProps)(ChooseGenres);
单击ListItem时,我将流派添加到event.genres数组中,并希望显示图标。
但即使状态中的事件对象已正确更新(我将其记录在控制台中),图标仍不会显示

我注意到的奇怪行为是,如果我返回导航并返回此组件,图标将正确显示。

您正在渲染:

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>
}
render(){
返回(
{item.name}
{this.eventhasgreen(this.state.event,item.id)&&
}
}>
}

首先,您不需要在构造函数中执行
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>
状态={
类型:[{id:1,名称:1},{id:2,名称:2},{id:3,名称:3}]
}
onGenreChange=(id)=>{
const-genres=this.state.genres.map(genre=>{
如果(genre.id==id){
返回{…流派,活动:!流派.活动}
}
返回体裁
})
这是我的国家({
体裁
});
}
this.onGenreChange(item.id)}>
{item.name}
{item.active&&
}
}>

渲染的返回是否需要一个右括号?你说得对。即使这不是我需要的,我也明白了,你让我理解。我认为更改状态会导致所有组件重新渲染。正如我对@Sterling Beason post的评论,这不是我需要的,但你也让我明白我做错了什么。谢谢。如果您直接修改state对象,那么它不会重新呈现受该状态影响的dom树部分