Reactjs 从道具设置初始状态
我正试图从我经过的道具为组件设置初始状态。该道具是从App.js传递的,在App.js中通过API调用填充道具 当我检查组件状态的值时,没有。这怎么可能 下面是从中设置初始状态的代码 这里是道具的填充位置 我的总体目标是能够更新ListBooks组件中的本地状态,因此它会立即更新(这部分的代码尚未完成),然后通过API在后台更新服务器。在每次更新后保存长时间重新加载。console.log(this.state.x)未定义,因为以下代码:Reactjs 从道具设置初始状态,reactjs,Reactjs,我正试图从我经过的道具为组件设置初始状态。该道具是从App.js传递的,在App.js中通过API调用填充道具 当我检查组件状态的值时,没有。这怎么可能 下面是从中设置初始状态的代码 这里是道具的填充位置 我的总体目标是能够更新ListBooks组件中的本地状态,因此它会立即更新(这部分的代码尚未完成),然后通过API在后台更新服务器。在每次更新后保存长时间重新加载。console.log(this.state.x)未定义,因为以下代码: componentDidMount() { cons
componentDidMount() {
console.log("Fetching All Books from API")
BooksAPI.getAll().then((books) => {
this.setState({books})
})
}
包括两个不保证在呈现之前完成的异步调用:BooksAPI.getAll()
和setState
但是,正如对您的问题的第二条评论所指出的,奇怪的是,您通过传递的道具在ListBooks
中设置了状态。传递道具的要点是不需要在获取道具的组件中设置本地状态
如您在问题的第4条评论中所述,如果您在
ListBooks
中修改它,那么您可能需要在ListBooks
中调用BooksAPI
,而不是传递道具。您肯定不应该这样做
首先,请阅读文档中的内容。它将告诉你正确的方式来组织你的国家
如果您可以从道具中获得所需的值—您不应该将其保持在状态—只需在渲染中使用道具即可
我的总体目标是能够更新ListBooks组件中的本地状态,因此它会立即更新(这部分的代码尚未完成),然后通过API在后台更新服务器。保存每次更新后的长时间重新加载
这不是一个好主意,因为您需要确保服务器上的数据已成功更改,否则您将显示不可靠的数据,这可能会让用户感到困惑
例如:让我们假设您有一个从服务器获得的书籍列表。然后用户将新书添加到此列表中,您立即更新状态
,然后向API发送请求,结果出现错误(例如,您发送了无效数据)。之后,用户决定更改这本新添加的书的信息,但当他/她尝试这样做时,服务器可能会返回404,因为没有这样的书。这有点让人困惑,不是吗?这有意义吗?我希望如此
祝你好运,享受你的编码:)如何称呼ListBooks?你是在BookApp中这样做的吗?为什么你需要在当地州存储它?你不能直接用道具吗?这是反模式之一。你可能想看看。如果这是绝对需要的,那么您应该从道具初始化状态。嗯,我可以直接从道具上使用它——我已经让这个部分工作了。但是,当有人对页面进行更改时,我希望页面立即重新呈现。否则,我必须通过将更改传递回prop方法来更新服务器…所以重新加载页面需要时间。我想要的是用户进行更改,立即更新组件状态,以便重新呈现页面,然后在后台更新API,以便两者对齐,但不必等待服务器调用。希望这能对更好的方法提出合理的建议?或者我如何确保它在手动之前加载更好的方法是,正如Hardik Modha所说,从列表簿中删除状态。我不明白你上面的评论(关于这个问题的第四条评论)。它将如何帮助您定义从道具设置的本地状态?如果在ListBooks中更新状态,那么您可能需要将其定义为状态并在ListBooks中调用BooksAPI.getAll…我想我现在明白了!谢谢,我很高兴!祝你好运谢谢非常有帮助…但是为了进行比较,我在某个网站的用户配置文件的设置页面上,我从下拉菜单中更改了一个帐户-它会立即更新,而无需点击提交。那个网站不正是我想要实现的吗?在后台更新服务器时更新本地状态
class BooksApp extends React.Component {
state = {
books: []
}
componentDidMount() {
console.log("Fetching All Books from API")
BooksAPI.getAll().then((books) => {
this.setState({books})
})
}
componentDidMount() {
console.log("Fetching All Books from API")
BooksAPI.getAll().then((books) => {
this.setState({books})
})
}