【发布时间】:2017-11-06 19:42:28
【问题描述】:
在 React 中,我将数据从父组件传递到子组件。两个组件都有自己的独立状态,其中包含一系列书籍。
我将父组件的书籍数组传递给子组件。我可以将子组件中的一本书添加到父组件。
在子组件中,我需要执行一个条件:如果子组件的书籍数组中有一个元素已经存在于父组件的书籍数组中,那么我需要更新书籍数组的一个属性子组件。
那么,我如何映射这两个数组并检查我的状况?
我正在尝试使用以下代码,但这不起作用。我知道下面的代码不是正确的方法,但我无法弄清楚如何继续
let parent_books = this.props.books;
this.state.child_books.map((book,index) => {
if(book === parent_books[index])
book.shelf = parent_books[index].shelf
})
因此,父书籍数组将有少量书籍已经存在于子书籍数组中。
所以我想检查父书籍数组中是否有一本书存在于子书籍数组中,然后我想将子书籍数组中的书架属性设置为父书籍数组中书籍的任何属性。
子组件中的所有书籍的初始书架属性为“无”。
任何人都可以建议如何进行此操作吗?
编辑
我正在尝试在下面的函数中实现代码。但是我在使用 setState 时遇到了一些问题。代码:
updateSearch = (searchString) => {
let parent_books = this.props.books;
this.setState({search: searchString.trim()})
let searchResults = BooksAPI.search(this.state.search,1).then((book_search) => {
if (book_search != undefined) {
console.log(book_search)
book_search.map((book) => book.shelf = 'none')
this.setState({ books : book_search })
console.log(this.state.books) //Gives the array of state
}
})
console.log(this.state.books) //Gives an empty array
this.state.books.map((book) => {
const parent = parent_books.find(parent => parent === book );
if(parent) {
console.log(book.title);
book.shelf = parent.shelf
}
})
}
第二个console.log 没有返回处于其后未执行地图功能的状态的书籍数组。我做错了什么?
【问题讨论】:
-
您是想简单地在
render中输出正确的shelf值,还是要更新子图书状态?如果您想更新子图书状态,那么我假设代码将存在于子组件componentWillReceiveProps()?在这种情况下,您可以setState使用map的结果。 -
@RickJolly 我想更新子书和父书的状态,这将使组件重新渲染。实际上,如果书存在,我想更改子组件中书的书架值在父组件中。父组件中的书在各自的书架中。在子组件中,最初所有书的书架属性设置为“无”
-
你能解释一下为什么你的状态在两个组件中都很明显吗?将状态保存在一个地方不是更容易吗?
-
map()返回一个数组。您需要使用forEach()和setState来更新组件的状态 -
@azium 实际上,我的父组件将进行 API 调用,其中默认情况下将有书籍在各自的书架上。所以,我对这一系列书籍有一个使用过的状态。在我的子组件,我可以搜索一本书并将这本书添加到父组件的书架。最初,在子组件中,书没有分配到任何书架。所以,我在搜索组件。搜索组件(子组件)将在搜索结果中列出所有书籍。从搜索页面,我可以将一本书添加到父组件的书架。
标签: javascript arrays reactjs