javascript - 状态更改后 UI 不呈现

标签 javascript reactjs ecmascript-6 react-router

我在 React 中有一个应用程序(Udacity 中的项目),它根据类别显示我书架上的书籍:当前阅读想要阅读> 并阅读。每次我将类别从“想要阅读”更改为“正在阅读”时,该书都会移动到正确的类别,在本例中它将是“当前正在阅读”。我的代码在这个上运行没有问题。但是,您也可以从庞大的图书库中进行搜索,其中您可以移动到书架,默认情况下类别为“无”,尽管您可以将书架中的现有图书作为搜索的一部分(除了主图书库之外) )。现在,我的问题是这样的,如果我从类别移动到想要阅读类别,例如,在我单击返回按钮后我的用户界面不会改变主页(即App.js)。然而,当我改变主要类别时,我没有问题。另外,我在调用时更新 App.js 中的书架的函数不会在控制台中显示任何错误。

我有以下组件:

 App
  |
  |--BooksSearch
  |--BooksList
  |     |--BookShelf
  |--BooksSearchPage
        |--BookShelf

BooksListBooksSearch 分别在主页(即 App.js)中显示书籍和搜索按钮。 BooksSearchPage 允许用户从图书馆搜索书籍并将其移入书架。 BookShelf 显示图书列表,无论它们是在书架上还是在图书馆中。

这是我的App.js

class App extends React.Component {

 state = {
 mybooks : [], 
 showSearchPage: false
}

componentDidMount() { 
 BooksAPI.getAll().then( (mybooks)=> { 
    this.setState({mybooks})
 })}

toCamelShelf(Shelf) {
 if (Shelf==="currentlyreading") return "currentlyReading"
 if (Shelf==="wanttoread") return "wantToRead"
 return Shelf
}

updateBookShelf = (mybook, shelf) => {
shelf=this.toCamelShelf(shelf)
BooksAPI.update(mybook, shelf).then(
this.setState((state)=>({      
    mybooks: state.mybooks.map((bk)=>bk.id === mybook.id ? 
    {...bk, shelf:shelf} : bk)
 })))}

render() {
 return (
   <div className="app">
     {this.state.showSearchPage ? (
       <Route path='/search' render={({history})=>(
        <BooksSearchPage mybooks={this.state.mybooks} onSetSearchPage={
            ()=>{ this.setState({showSearchPage:false});
                  history.push("/");
              }}
              onUpdateBookShelf={this.updateBookShelf}
            />
      )} />
    ) : (
      <Route exact path='/' render={()=>(
        <div className="list-books">
          <div className="list-books-title">
            <h1>My Reads</h1>
          </div>
          <BooksList mybooks={this.state.mybooks} 
            onUpdateBookShelf={this.updateBookShelf}/>
          <BooksSearch onSetSearchPage={()=>this.setState({showSearchPage:true})}/>
        </div>
      )} />           
    )}
  </div>
  )
 }
}

export default App

由于代码太长,我添加了我的 repo在 Github 上。我对 ReactJS 非常陌生,过去 3 天一直在调试这个问题,但没有结果。

最佳答案

我很难充分理解该应用程序,无法确切知道原因,但这听起来像是一个州问题。

如果您离开并返回,或者单击某些内容但它没有正确更新,则表明当时(该事件)状态没有更新,或者在该事件之前没有正确保存状态。

一旦重现问题事件,就问问自己“在我执行此操作之前状态是什么?”以及“为什么现在的状态是这样的?”

  1. 您是否忘记更新状态?
  2. 是否从某处获取了错误的状态?
  3. 您调用了 this.setState({ some }) 吗?
  4. 您是否覆盖了状态而不是添加了状态?
  5. 是否缺少状态更新?

在两个页面上,就在之前和之后,添加渲染方法:console.log(this.state),如果需要,console.log(this.props)。我想如果你看看那里你就会发现问题。问题是事情到底是怎么变成这样的?重新访问您的所有状态更新。

如果您离开并返回,它从哪里获得该状态?为什么这些数据在那里?

请记住,React 是一个状态机。状态是一个对象,每次查看它时都会有数据快照。这就像查看一张包含所有数据的纸。如果您离开房间并回来时数据不存在,那么是什么更新了您的状态并使其消失?或者为什么它没有被添加到您的州?那里的机制导致了你的问题。

我在您的代码中发现了一些需要关注的地方:

BooksAPI.update(mybook, shelf).then(
this.setState((state)=>({      
    mybooks: state.mybooks.map((bk)=>bk.id === mybook.id ? 
    {...bk, shelf:shelf} : bk)
 })))}

<BooksSearchPage mybooks={this.state.mybooks} onSetSearchPage={
        ()=>{ this.setState({showSearchPage:false});
              history.push("/");
          }}
          onUpdateBookShelf={this.updateBookShelf}

<BooksList mybooks={this.state.mybooks} 
            onUpdateBookShelf={this.updateBookShelf}/>
          <BooksSearch onSetSearchPage={()=>this.setState({showSearchPage:true})}/>

也在这里:

class App extends React.Component {
  state = {
  mybooks : [], 
  showSearchPage: false
 }

componentDidMount() { 
 BooksAPI.getAll().then( (mybooks)=> { 
    this.setState({mybooks})
 })}

我怀疑其中一个表现得太强烈,或者其中一个没有在正确的时间更新,或者数据被覆盖。

console.log() 应该是最有帮助的。如果您的数据丢失。让它在那时出现,问题就会消失:)(P.S.在 componentDidMount 上 setState 看起来有点可疑)。

关于javascript - 状态更改后 UI 不呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46539977/

相关文章:

javascript - ECMAScript 6 类属性下划线前缀

javascript - 关于 ES6 数组解构和交换的有趣行为

没有名称的 Javascript ES6 导入

javascript - 使用 javascript 将 ckEditor 中的选定内容替换为新内容

javascript - 如何在react-split-pane中支持单独滚动各个 Pane ?

javascript - ReactJS - 如何使用 javascript 访问组件的显示名称?

reactjs - Apollo GraphQL React - 如何点击查询?

JavaScript 对象和方法,但 getName 不是函数

javascript - 背景图片问题

javascript - 打印带有标记的谷歌地图