我正在搭建一个三个书架(阅读、想阅读、阅读)的应用程序。
我已经为工具架创建了一个组件,并将其放在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;
问题在于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文件中的集合,它首先注销一个空数组,然后是一个包含元素的数组。