我拥有App.js
中列出的所有组件。关于如何将值从一个组件传递到另一个组件,我有点迷茫。
这是它应该如何工作的:
在第一个组件(ItemList
)中选择一项时,详细信息将加载到第二个组件(ItemDetails
)中。然后在第二个组件中,如果我单击“添加”,它将被添加到第三个组件(ItemSelection
)。
如何将单击ItemList
中的单击项传递给ItemDetails
,然后单击按钮时将其传递给ItemSelection
?
App
组件:
// dummy selectedItems array
let selectedItems = [
{
'name': 'item 3',
'type': ['car'],
'details': [ 'Detail 1', 'Detail 2', 'Detail 3' ]
},
{
'name': 'item 6',
'type': ['bike'],
'details': [ 'Detail 5', 'Detail 1']
}
]
<Container>
<ItemList/>
<ItemDetails/>
<ItemSelection selected={selectedItems}/>
</Container>
ItemList
组件:
const LIST_ITEMS = require('./LIST_ITEMS.json');
const myList =
LIST_ITEMS.data.Items.map((Item) => (
<li key={Item.id} onClick={() => loadItem(Item.name)}>
{Item.name.toUpperCase()}
</li>
))
;
function loadItem(name){
console.log(name);
}
class ItemList extends Component {
render() {
return (
<div id="item-list-wrapper">
<h3>Select an Item</h3>
<ul id="item-list">{myList}</ul>
</div>
);
}
}
ItemDetails
组件:
import React, { Component } from 'react';
class ItemDetails extends Component {
render() {
<div id="item-details">
// Additional details about the item
<button>Add to selection</button>
</div>
}
}
ItemSelection
组件:
import React, { Component } from 'react';
class ItemSelection extends Component {
render() {
<div id="item-selection">
// List selected items
<h3>Selected Items</h3>
<div className="item-slot">
{this.props.selected[0] ? (
<div className="selected-details">
<h4>{this.props.selected[0].name}</h4>
<ul>
<li>{this.props.selected[0].details[0]}</li>
<li>{this.props.selected[0].details[1]}</li>
<li>{this.props.selected[0].details[2]}</li>
</ul>
</div>
) : (
<p>empty</p>
)}
</div>
</div>
}
}
答案 0 :(得分:2)
首先,我建议使用the article, "Lifting State Up", as referenced by @codekaizer in the comments。
您要从本文中借鉴的主要原则是
React应用程序中任何更改的数据都应有一个“真相来源”。
对于您的情况,单一的“真理来源”应该是您的App
组件-与ItemList
,ItemDetails
和ItemSelection
交谈的那个组件。
组件之间的通信流应如下所示:
ItemList
App
会在道具中告诉我。App
会在道具中告诉我。ItemDetails
App
会在道具中告诉我App
会在道具中告诉我。ItemSelection
App
会在道具中告诉我。App
ItemList
显示哪些项目?我将继续传递LIST_ITEMS.json
ItemDetails
显示哪个项目的详细信息?我将在state
中将其保留为currentItem
。最初,不会显示任何项目的详细信息。
ItemList
中的项目之一,那么我需要将状态currentItem
更改为单击的项目。 (提示:App
需要一个函数,并且该函数的回调需要传递给ItemList
)ItemSelection
显示哪些项目?我将在state
中将其保留为selectedItems
。最初,不会选择任何项目。
ItemDetails
中显示的项目被“选中”,那么我需要将该当前显示的项目添加到我的selectedItems
数组中。 (提示:App
需要一个函数,并且该函数的回调需要传递给ItemDetails
)App
应该维护state
,其中currentItem
将显示在项目详细信息中,而selectedItems
将显示在项目选择列表中。App
需要一些用于操纵currentItem
和selectedItems
状态的函数。App
需要将这些函数回调传递给子代。我已经编写了一个基本示例,说明这一切的实际效果。通过研究并将其应用于您的情况,应该可以使您更好地了解如何使组件“相互交谈”。