Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Reactjs 从道具设置初始状态_Reactjs - Fatal编程技术网

Reactjs 从道具设置初始状态

Reactjs 从道具设置初始状态,reactjs,Reactjs,我正试图从我经过的道具为组件设置初始状态。该道具是从App.js传递的,在App.js中通过API调用填充道具 当我检查组件状态的值时,没有。这怎么可能 下面是从中设置初始状态的代码 这里是道具的填充位置 我的总体目标是能够更新ListBooks组件中的本地状态,因此它会立即更新(这部分的代码尚未完成),然后通过API在后台更新服务器。在每次更新后保存长时间重新加载。console.log(this.state.x)未定义,因为以下代码: componentDidMount() { cons

我正试图从我经过的道具为组件设置初始状态。该道具是从App.js传递的,在App.js中通过API调用填充道具

当我检查组件状态的值时,没有。这怎么可能

下面是从中设置初始状态的代码

这里是道具的填充位置

我的总体目标是能够更新ListBooks组件中的本地状态,因此它会立即更新(这部分的代码尚未完成),然后通过API在后台更新服务器。在每次更新后保存长时间重新加载。

console.log(this.state.x)未定义,因为以下代码:

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})
  })
}