首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在获取请求后更新ReactJS组件?

如何在获取请求后更新ReactJS组件?
EN

Stack Overflow用户
提问于 2018-06-23 11:10:05
回答 3查看 5.8K关注 0票数 0

嗨,我试图更新一个反应组件,这是不工作的。当用户单击同级组件上的按钮时,将向my发出post请求。此组件的目的是通过以下方法创建这些事件的列表:

  1. 首先,在我的api中查询已发布的事件ids。
  2. 然后通过事件ids循环,并为每个事件向外部api发出一个获取请求,在该api中,事件信息总是被更新的。
  3. 当从外部api查询每个事件时,结果被推送到一个空数组中。
  4. 最后,当一个新事件被推到数组中时,状态将被设置。

这是可行的,但是当一个新事件被保存到我的api中时,这个组件将不会重新呈现。下面是我的代码,它没有更新:

代码语言:javascript
运行
AI代码解释
复制
class EventList extends Component {

constructor(props){
    super(props)
    this.state = {
        userEvents: []
    }
}

//Create a function to load active user's saved events in api
loadEvents = () => {
    const ActiveUser = JSON.parse(localStorage.getItem("ActiveUser"))

    //Get active user's events from vetharbor.json
    fetch(`http://localhost:8088/events?userId=${ActiveUser.id}`)

    //convert get to json data
    .then(r => r.json())

    .then(allEvents => {
        let events = []
        //for each event tied to active user's id, loop thru and ...
        allEvents.forEach(event => {

            //make a fetch request to eventbrite with the event's id
            fetch(`https://www.eventbriteapi.com/v3/events/${event.id}/?token=MY_API_Token`)

            //convert response to json
            .then(r => r.json())

            //return the data???
            .then(ue => {
               events.push(ue)
               // this.userEvents = events
                this.setState({
                    userEvents: events
                })
            })
        }) 
    })
}

    shouldComponentUpdate(nextProps, nextState){
    if(this.state.userEvents !== nextState.userEvents){
        return true
    }

}

componentDidUpdate(){
    this.loadEvents()
}

//run the function in a component did mount
componentDidMount(){
    console.log("component did mount")
    this.loadEvents()
}

render() {

    return (
        <div className="event-list">
        <h3>These are events</h3>
        {this.state.userEvents.map(ues => {
           return <h1 key={ues.id}>{ues.name.text}</h1>
        })}

        </div>
        );

    }
}

export default EventList
EN

回答 3

Stack Overflow用户

发布于 2018-06-23 11:25:50

这里,

代码语言:javascript
运行
AI代码解释
复制
    shouldComponentUpdate(nextProps, nextState){
        if(this.state.userEvents === nextState.userEvents){
            return true
        }
    }

在您的示例中,shouldComponentUpdate不返回true,因为旧的userEvents和新的userEvents不同,逻辑也不正确。尝试将其更改为:

代码语言:javascript
运行
AI代码解释
复制
if(!(this.state.userEvents).equals(nextState.userEvents)){
                return true
}
票数 0
EN

Stack Overflow用户

发布于 2018-06-24 16:16:49

现在我意识到我的逻辑中有一个错误,因此我修改了上面的代码如下,它现在更新我的代码(用一个无限循环,但它确实更新)

发自:

shouldComponentUpdate(nextProps,nextState){ if(this.state.userEvents === nextState.userEvents){返回真}

至:

shouldComponentUpdate(nextProps,nextState){ if(this.state.userEvents !== nextState.userEvents){返回真}

票数 0
EN

Stack Overflow用户

发布于 2018-07-02 20:37:54

无限循环是由componentDidUpdate再次获取数据引起的,setState导致再次调用componentDidUpdate,后者再次加载再次调用setState的数据。删除componentDidUpdate或添加条件逻辑,如果您真的需要它(您几乎从来没有这样做),应该修复它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51004294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档