javascript - React - 使用 for 循环创建 x 个组件实例

标签 javascript reactjs

我正在解决一个有趣的 react 练习,其中可以有多个输入字段,并且更改其中任何一个都会更新总和值,我想知道如何使用 for 循环创建 x 个输入元素。我创建了一个名为 createInputs 的函数,它接受一个数字并输出输入组件的一个实例。它们返回为 [object Object][object Object][object Object,我该如何解决这个问题?

class Input extends Component {
  state = {
    number: ''
  }

  handleInput = e => {
    const { value } = e.target;
    const parsedValue = value !== '' ? parseFloat(value) : value;

    if (parsedValue !== '') {
      if (Number.isInteger(parsedValue)) {
        this.setState({ number: parsedValue });
        this.props.updateSum(parsedValue, this.props.index);
      } else {
        alert('Please enter a valid (numeric) value for Input #' + this.props.index);
      }
    } else {
      this.setState({ number: '' });
      this.props.updateSum(0, this.props.index);
    }
  }

  render() {
    return (
      <div>
        <span>{this.props.index}</span>
        <input onChange={this.handleInput} type="text" value={this.state.number} />
      </div>
    )
  }
}

class Sum extends Component {
  state = {
    sum: []
  }

  createInputs = count => {
let ui = '';

for (let i = 0; i < count; i++) {
  ui+= <Input index={i} updateSum={this.updateSum} />
}

return ui;
  }

  updateSum = (e, index) => {
    const _sum = this.state.sum.slice(0);
    _sum[index] = e;
    this.setState({
      sum: _sum
    })
  }

  render() {
    const { count, sum } = this.state;
    return (
      <>
        {
          this.createInputs(this.props.count)
        }
        <div>
          <span>Sum: {sum.length > 0 ? sum.reduce((a, v) => a += v) : 0}</span>
        </div>
      </>
    )
  }
}

class App extends Component {
  render() {
    return (
      <Sum count={3} />
    );
  }
}

export default App;

最佳答案

因为在 for loop您使用了return 。在第一个循环期间它将返回值。相反,只有array中的他们然后map超过它。如果您不需要包装<div>您可以使用<React.Fragment>

createInputs = count => {
    let arr = []
    for (let i = 0; i < count; i++) {
      arr.push(<Input index={i} updateSum={this.updateSum} />)
    }
    return(<div>
        {arr.map(input=>input)}
        </div>)
  }

如果您不想创建数组然后推送,则使用

createInputs = count => {
    return(<div>{Array(count).fill(1).map((input,i)=>(
            <Input index={i} updateSum={this.updateSum} />))}
           </div>)
  }

关于javascript - React - 使用 for 循环创建 x 个组件实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54466094/

相关文章:

reactjs - Redux saga - 如果数据已存在于 redux 存储中,则跳过 API 请求

javascript - react 语义用户界面 : How to set focus for input field of dropdown element

javascript - React 组件如何单独测量未知数量的子项,然后根据高度修改布局

javascript - 在 ExtJS 4 柱形图中设置最大条宽?

javascript - DOJO:dojox.grid.TreeGrid + 复选框如何

javascript - 交换两个 div(或与此相关的任何对象)的堆叠顺序

javascript - "' react ' was used before it was defined."eslint 警告

reactjs - 如何分析 Next Js 包的大小和内容

javascript - 如何使用带有模块 es6 的 ECMAScript(vanilla javascript)导入

javascript - Photoshop 的 Extendscript 或 Javascript 中是否有任何 'document.getElementById' 等效项?