Reactjs 如何将用户创建的数组传递给另一个组件?
我是新来的。事实上,我对任何前端编程语言都是新手。因此,我遇到了许多非常奇怪,有时甚至是可笑的问题。我正在努力将数组发送到另一个组件。问题是用户创建了该数组,它是在render()中动态创建的{return(..)}Reactjs 如何将用户创建的数组传递给另一个组件?,reactjs,frontend,react-component,Reactjs,Frontend,React Component,我是新来的。事实上,我对任何前端编程语言都是新手。因此,我遇到了许多非常奇怪,有时甚至是可笑的问题。我正在努力将数组发送到另一个组件。问题是用户创建了该数组,它是在render()中动态创建的{return(..)} 我在片段中看到了几个问题- 您正在将this.getItems作为道具传递给您的子组件。它从未在父级中定义。我认为应该是您创建的items数组状态 chosenItems应该是一个状态,您应该深入了解如何更新状态。有一个setState功能,学习它 在child中,构造函数也是
我在片段中看到了几个问题-
this.getItems
作为道具传递给您的子组件。它从未在父级中定义。我认为应该是您创建的items
数组状态
chosenItems
应该是一个状态,您应该深入了解如何更新状态。有一个setState
功能,学习它
首先,您必须了解,未设置为状态的内容不会导致重新渲染,因此更新的数据不会反映到UI或传递到子级 其次,您不需要将从父级传递的数据再次存储到子级,您可以直接从props使用它
class Home extends Component {
state = {
items: [],
chosenItems []
};
// code to import JSON from backend API, irrelevant, that part works fine
addItem(item){
this.setState(prev => ({
chosenItems: [...prev.chosenItems, item]
}))
}
render() {
const {items} = this.state;
return (
<div>
//some code
<div key={item.id}>
{item.name} {item.price}<img src = {item.url} className="photo"/><button onClick={() => this.addItem(item)}>ADD</button>
</div>
<Basket chosenItems ={this.state.chosenItems} />
/div>
)
}
}
class Home扩展组件{
状态={
项目:[],
chosenItems[]
};
//从后端API导入JSON的代码,不相关,这部分工作正常
附加项(项目){
this.setState(prev=>({
chosenItems:[…prev.chosenItems,item]
}))
}
render(){
const{items}=this.state;
返回(
//一些代码
{item.name}{item.price}this.addItem(item)}>ADD
/div>
)
}
}
class.Component{
render(){
返回(
{this.props.chosenItems.map(item=>{item.name}}
);
}
}
出口违约篮子;
请查看如何改变组件的状态。您将在本文档中找到更多的基础知识。
日志中出现undefined
的原因是主组件中的this.getItems()
正在返回undefined
,或者没有这样的方法,或者状态变量本身可能是undefined
简而言之,有几件事:
当您想要将数组传递给子组件时,只需为例如传递任何对象或属性即可(我希望您想要将所选项目传递给Basket组件)
始终在构造函数中初始化状态。
所以chooseItems和items应该是状态和构造函数内部的一部分
您的代码应该如下所示:
class Home extends Component {
constructor(props) {
super(props)
this.state = {
chosenItems: [],
items: [],
}
}
addItem(item){
this.setState({
chosenItems: [...this.state.chosenItems, item]
})
console.log(this.chosenItems); //logs created array, everything works like a charm
}
render() {
const {items, chooseItems} = this.state;
return (
items.map(item => {
return (
<div key={item.id}>
{item.name} {item.price}<img src = {item.url} className="photo"/>
<button onClick={() => this.addItem(item)}>ADD</button>
</div>
)
})
<Basket dataFromParent={chooseItems} />
div>
)
}
}
class Home扩展组件{
建造师(道具){
超级(道具)
此.state={
选择项目:[],
项目:[],
}
}
附加项(项目){
这是我的国家({
chosenItems:[…this.state.chosenItems,item]
})
console.log(this.chosenItems);//创建了日志数组,一切都像一个符咒
}
render(){
const{items,chooseItems}=this.state;
返回(
items.map(item=>{
返回(
{item.name}{item.price}
this.addItem(item)}>ADD
)
})
div>
)
}
}
篮子组件不需要构造函数,因为所需数据来自父组件:
class Basket extends React.Component {
render() {
return (
<div>
{this.props.dataFromParent.map(item => <h2>{this.props.dataFromParent}</h2>)}
</div>
);
}
}
export default Basket;
class.Component{
render(){
返回(
{this.props.dataFromParent.map(项=>{this.props.dataFromParent}}
);
}
}
出口违约篮子;
由于某种原因,当数组由ID组成时,它可以工作,但我有另一个问题。阵列将在其所在位置打印。但当整个对象被传递时,程序在按下“添加”按钮后崩溃。这是因为,为了渲染数组,需要在其上进行映射。更新了我的答案,谢谢。成功了。但是有一个小问题。当我单击添加时,数组立即显示在上面问题中没有显示路由的地方。好的,我刚刚更新了帖子。如果你是新手,强烈建议你开始使用功能组件而不是类组件。你最终将不得不使用它们。所以,现在比以前更好了,你已经适应了班级的生活。
class Basket extends React.Component {
render() {
return (
<div>
{this.props.chosenItems.map(item =>
<div key={item.id}>
{item.name}{item.price}
</div>
)}
</div>
);
}
}
<Basket chosenItems ={this.state.chosenItems} />
TypeError: Cannot read property 'map' of undefined
class Home extends Component {
state = {
items: [],
chosenItems []
};
// code to import JSON from backend API, irrelevant, that part works fine
addItem(item){
this.setState(prev => ({
chosenItems: [...prev.chosenItems, item]
}))
}
render() {
const {items} = this.state;
return (
<div>
//some code
<div key={item.id}>
{item.name} {item.price}<img src = {item.url} className="photo"/><button onClick={() => this.addItem(item)}>ADD</button>
</div>
<Basket chosenItems ={this.state.chosenItems} />
/div>
)
}
}
class Basket extends React.Component {
render() {
return (
<div>
<h2>{this.props.chosenItems.map(item=> <div>{item.name}</div>)}</h2>
</div>
);
}
}
export default Basket;
class Home extends Component {
constructor(props) {
super(props)
this.state = {
chosenItems: [],
items: [],
}
}
addItem(item){
this.setState({
chosenItems: [...this.state.chosenItems, item]
})
console.log(this.chosenItems); //logs created array, everything works like a charm
}
render() {
const {items, chooseItems} = this.state;
return (
items.map(item => {
return (
<div key={item.id}>
{item.name} {item.price}<img src = {item.url} className="photo"/>
<button onClick={() => this.addItem(item)}>ADD</button>
</div>
)
})
<Basket dataFromParent={chooseItems} />
div>
)
}
}
class Basket extends React.Component {
render() {
return (
<div>
{this.props.dataFromParent.map(item => <h2>{this.props.dataFromParent}</h2>)}
</div>
);
}
}
export default Basket;