当前位置: 首页 > 知识库问答 >
问题:

反应状态不更新组件上的筛选器

耿永寿
2023-03-14

我正在搭建一个三个书架(阅读、想阅读、阅读)的应用程序。

我已经为工具架创建了一个组件,并将其放在App.js上。当我更新一本书的状态(changeCategory函数)时,书的数据确实更新了,但书架组件没有更新:(

我的代码:

import { useState, useEffect } from 'react';
import BooksCategory from './components/BooksCategory';

import * as BooksAPI from './BooksAPI';

import './App.css';

function App() {
  const [books, setBooks] = useState([]);

  useEffect(() => {
    BooksAPI.getAll().then((data) => {
      setBooks(data);
    });
  }, []);

  const changeCategory = (id, e) => {
    BooksAPI.update(id, e.target.value).then((data) => {
      const updatedBooks = books.map((book) => {
        var temp = Object.assign({}, book);
  
        if (temp.id === id) {
          temp.shelf = e.target.value;
        }
  
        return temp;
      });
  
      setBooks(updatedBooks);

      console.log(books);
    });
  }

  return (
    <div className='wrapper'>
      <aside>
        Aside
      </aside>

      <main>
        <h1>Explore</h1>

        <BooksCategory
          name='Readings'
          books={ books.filter((book) => { return book.shelf === 'currentlyReading' }) }
          onChangeCategory={ changeCategory }
        />

        <BooksCategory
          name='Wanted'
          books={ books.filter((book) => { return book.shelf === 'wantToRead' }) }
          onChangeCategory={ changeCategory }
        />

        <BooksCategory
          name='Read'
          books={ books.filter((book) => { return book.shelf === 'read' }) }
          onChangeCategory={ changeCategory }
        />

        <div>
          { books.map((book) => {
            return (
              <p key={ book.id}>
                { book.id } <br />
                { book.title } <br />
                { book.shelf } <br /><br />
              </p>
            )
          }) }
        </div>
      </main>
    </div>
  );
}

export default App;

我的图书分类组件:

import React from 'react';

function BooksCategory(props) {
    return (
        <div className='booksCategory'>
          <h3>{ props.name }</h3>

          <ul>
            { props.books.map((book) => (
              <li key={ book.id }>
                <div className='bookBackground'>
                  <div className='bookPhoto'>
                    <img src={ book.imageLinks.smallThumbnail } alt={ book.title } />
                  </div>

                  <i className='fa fa-bars'>
                    <select name='teste' onChange={ (e) => { props.onChangeCategory(book.id, e) } }>
                        <option value='Reading'>Reading</option>
                        <option value='Want To Read'>Want To Read</option>
                        <option value='Read'>Read</option>
                    </select>
                  </i>
                </div>

                <p className='bookName'>{ book.title.length <= 30 ? book.title : book.title.substring(0, 27) + '...' }</p>
                <p className='bookCategory'>{ book.categories ? book.categories : 'Others' }</p>
              </li>
            ))}
          </ul>
        </div>
    );
}

export default BooksCategory;

共有1个答案

秦学林
2023-03-14

问题在于BookCategory组件。在此组件中,在<代码>选择<代码>字段中,选项有值<代码>读取<代码>,<代码>想要读取<代码>和<代码>读取<代码>以及您的<代码>书籍。书架<代码>将具有相同的值,但在中使用过滤器时,您正在筛选值<代码>读取<代码>当前读取<代码>,<代码>想要读取<代码>。

import React from 'react';

function BooksCategory(props) {
    return (
        <div className='booksCategory'>
          <h3>{ props.name }</h3>

          <ul>
            { props.books.map((book) => (
              <li key={ book.id }>
                <div className='bookBackground'>
                  <div className='bookPhoto'>
                    <img src={ book.imageLinks.smallThumbnail } alt={ book.title } />
                  </div>

                  <i className='fa fa-bars'>
                    <select name='teste' onChange={ (e) => { props.onChangeCategory(book.id, e) } }>
                        <option value='currentlyReading'>Reading</option>
                        <option value='wantToRead'>Want To Read</option>
                        <option value='read'>Read</option>
                    </select>
                  </i>
                </div>

                <p className='bookName'>{ book.title.length <= 30 ? book.title : book.title.substring(0, 27) + '...' }</p>
                <p className='bookCategory'>{ book.categories ? book.categories : 'Others' }</p>
              </li>
            ))}
          </ul>
        </div>
    );
}

export default BooksCategory;
 类似资料:
  • 问题内容: 所以我有这个: newDealersDeckTotal只是一个数字数组,例如,但是没有给出正确的总数,但是呢?我什至设置了超时延迟,以查看是否可以解决问题。任何明显的还是我应该发布更多代码? 问题答案: 通常是异步的,这意味着在您处于状态时,它尚未更新。尝试将日志放入方法的回调中。状态更改完成后执行:

  • 问题内容: 在这里,我尝试设置为’hello’,然后打印它,但是状态似乎为空。当我刚刚使用更新状态时怎么办?设置为全局变量。 问题答案: 从reactjs文档中: 不会立即变异,但会创建待处理的状态转换。调用此方法后进行访问可能会返回现有值。 https://facebook.github.io/react/docs/component- api.html 您可以做的是将状态更新后传递给回调函数:

  • 问题内容: 我处于状态的对象数组: 我需要能够基于id属性搜索items数组,然后更新对象属性。 我可以使用id参数通过数组或在数组上获取对象。 我遇到的麻烦是更新数组,然后更新状态而不会发生突变。 此时,我有一个匹配的对象,可以使用对象传播来更新它的属性: 我的问题是我该如何更新状态,以使其覆盖初始查找操作返回的对象? 问题答案: 您的更新功能如下所示 你这样使用它 毛吧? 如果您继续以这种方式

  • 在这种情况下,我更改选择元素并调用数据更新方法。该方法从状态获取值。但是当数据更新时,状态还没有改变。当您再次调用数据更新时,状态已经更新了如何正确进行更新? 反应成分

  • 我正在尝试新的hooks功能,并坚持认为我的状态没有更新。 实际上,状态已更新(我可以在console.log中看到更新的值,并且我的组件会重新运行useEffect),但是useEffect方法使用我的旧状态,并仅将签名保存给第一个用户,而活动用户在状态中确实发生了更改。 我想过添加useCallback,并将我的方法移动到use效果或组件本身,但我可以设法让它工作。 状态: 这是我的效果: 这

  • 我的Redux状态是如何更新的,可以在pokelist.js文件中注销,但是我的状态变量没有设置好,cardList还是一个空数组,我如何正确设置状态?我注销pokelist.js文件中的集合,它首先注销一个空数组,然后是一个包含元素的数组。