【问题标题】:Programmatically adding more components in React以编程方式在 React 中添加更多组件
【发布时间】:2019-01-25 01:39:06
【问题描述】:

我想将模板作为道具或子项传递,每次单击“添加”时,我都想再添加一个项目。

这是我到目前为止的地方:

App.js

<List template={
  (<Item>
      <span>Test</span>
   </Item>)
} />

List.js

...
add = () => {
    const list = this.state.list;
    const i = list.length + 1;
    const newItem = cloneElement(this.props.template, { key: i });
    this.setState({ list: this.state.list.concat([newItem]) });
}

...

render() {
    return (
      <div className="list">
        {this.state.list}
        <button onClick={this.add}>Add</button>
      </div>
    );
  }

但尽管添加了一个新项目,但它没有子项,因此“项目”存在,但“跨度”不存在。所以列表总是空的。

有人知道怎么做这样的事情吗?

关键是 List 不能知道传递给它的内容。无论你通过什么,它都应该添加。

【问题讨论】:

  • 不确定是否是同一个问题。在这种情况下,SampleComponent 是在 App 组件中定义的。我想要的是 App 组件现在了解 SampleComponent。它必须将其作为道具接收

标签: javascript reactjs jsx react-component


【解决方案1】:

您的 List 组件仅呈现子组件。我基本上会做类似下面的事情

 class List extends Component{
     render(){
         return(
             <div>
                 {this.props.children}
             </div>
         )
    }
}

您可以调用 List 并传递项目或类似以下内容

您的按钮位于您调用 List 的组件中,并且您将 onClick={this.add} 传递给按钮。类似下面的东西

 this.state ={
      items: []
 }
 add = () => {
      const item =  <Item>
           <span>Test</span>
         </Item>
      this.setState(prevState => ({
           items: [...prevState.items, item]
      }));
  }
 <div>
      <List>
          {items}
      </List>
      <button onClick={this.add} />
   </div>

抱歉,如果我在手机上输入答案时出现语法或拼写错误

【讨论】:

  • 但在按下“添加”后,它应该添加一个新的“项目”。此逻辑必须在 List 组件内
  • 我更新了我的答案,请检查。每当单击添加按钮时,这将添加新项目
  • 我刚刚尝试过,发生的事情是我所说的列表变为空,因为孩子的孩子(在本例中为 )不存在。
  • @VictorFerreira 这是因为 组件。您必须确保 组件呈现其作为 prop childrend 传递的子组件。 const Item = props =&gt; (&lt;div className="item-container"&gt;{props.children}&lt;/div&gt;).@Hemadri Dasari 为您的问题提供了一个优雅的解决方案。他以正确的方式完成了如何根据状态更新状态。如果您想在 组件中使用添加逻辑,您可以通过通过道具的逻辑。我认为如何改进你的代码的最佳想法是在这里或在代码审查中展示所有这些。干杯!
【解决方案2】:
import React, { Component } from 'react';

class Item extends Component {

  render(){
    return (<p>This is an item
      {this.props.children}
    </p>)
  }

}

class List extends Component {

  constructor(props){
    super(props);
    this.state = {list: []};
  }

  add = () => {
    const list = this.state.list;
    const i = list.length + 1;
    const newItem = React.cloneElement(this.props.template, { key: i });
    this.setState({ list: this.state.list.concat([newItem]) });
    console.log(this.props.template);
  }

  render() {
    return (
      <div className="list">
        {this.state.list}
        <button onClick={this.add}>Add</button>
      </div>
    );
  }

}

class App extends Component {
  render() {
    return (
      <List template={
        (<Item>
            <span>This is a Template</span>
         </Item>)
      } />
    );
  }
}

export default App;

【讨论】:

  • 它和我做的有什么不同?
  • 不确定 - 没有看到您的 Item 组件 - 您是否让它渲染 this.props.children?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 2013-12-23
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多