【问题标题】:How would I iterate through array and display input boxes based on values?我将如何遍历数组并根据值显示输入框?
【发布时间】:2020-07-31 00:10:11
【问题描述】:

我是新手,我创建了一个像这样的 json:

const parent: [{name:will, kids['child1', 'child2']}
              {name: 'kia' kids['child1']}
              {name: 'jim', kids['child1', 'child2']}]

我无法使用此 json 访问值。我正在尝试创建一个包含数组中所有名称值的列表,这样我就可以将它放在下拉列表中,但是当我尝试在我的 console.log 中打印列表时,我一直得到“未定义”

此外,当我单击名称时,我想根据所选名称的孩子列表的长度创建输入框。因此,例如,如果我在下拉菜单中单击“将”,将形成两个输入框,两个输入框中都有“child1”和“child2”。但是如果我点击“起亚”,一个输入框将形成一个已经有“孩子1”的输入框。有任何想法吗?我在访问这些值时遇到了很多麻烦。

这是我目前的尝试:

import Dropdown from 'react-dropdown';


 parent: [{name:will, kids['child1', 'child2']}
              {name: 'kia' kids['child1']}
              {name: 'jim', kids['child1, 'child2']}]


 
class AppEX extends React.Component {
constructor() {
    super();
    this.state = {
      parentnamelist: []
      parentname: null
      

    }
  }
  
 render() {
namelist: []
this.state.parent.map((e, key) => {
       namelist.push({value:e.name,label:e.name})
  })
        return (

<select name="select" onChange={this.namelist}>
  {num.map(function(n) { 
      return (<option value={n} selected={this.state.selected === n}>{n}</option>);
  })}
</select>

有什么想法吗?

【问题讨论】:

    标签: arrays json reactjs npm dropdown


    【解决方案1】:

    这里有各种各样的问题。

    1. parent 列表格式不正确,应如下所示:
    const parent = [
      { name: "will", kids: ["child1", "child2"] },
      { name: "kia", kids: ["child1"] },
      { name: "jim", kids: ["child1", "child2"] }
    ]
    
    1. 您在render 方法中使用map 将父名称推送到名为namelist 的新列表中,但您必须使用forEachmap 转换一个列表,而forEach 对每个成员做一些事情。
    const namelist = [];
    this.state.parent.forEach(e => {
      namelist.push({ value: e.name, label: e.name });
    });
    
    1. 现在render return: onChange 处理程序必须是一个函数,因为您想跟踪选定的父级,我猜您想将其保存到您的状态:
    handleParentChoice = e => {
      e.persist();
      this.setState({
        parentname: e.target.value
      });
    };
    

    然后

    return (
      <div>
        <select name="select" onChange={this.handleParentChoice}>
          {namelist.map(n => (
            <option key={n.value} value={n.value}>{n.label}</option>
          ))}
        </select>
        <br />
        {this.state.parentname && // Shows below stuff only if parentname is not null
          this.state.parent
            .find(p => p.name === this.state.parentname) // Find the parent based on the saved name, then map the kids into input tags
            .kids.map(k => <input key={k} type="text" />)}
      </div>
    );
    

    另外,当你映射一些东西时,每个孩子都应该有一个key 属性。

    See the code working here

    【讨论】:

    • ohhhh 我想我明白我做错了什么!也感谢您的 cmets!...有什么方法可以在输入框中实际包含值?就像我点击时会在一个输入框中显示“child1”吗?
    • @JTHDR 当然,只需将value 属性放在input 标签上:&lt;input key={k} type="text" value={k} /&gt;
    • 哦哦哦好的!而且我知道我可以使用 this.state 访问框中的内容...但我有最后一个问题 ..,如果框根据孩子的 len 更改...我如何仍然使用 this 访问框如果想在 console.log 中查看两个输入值,.state 最后说一下?
    • 抱歉,我没听明白。关于所选孩子的信息通过parentname 在您的州内,您实际上要记录什么,用户输入?孩子的名字?
    • 所以我的意思是当我点击“jim”时。现在有3个输入框。如何使用 this.state 访问每个输入框?我问是因为让我们说如果在控制台日志中我想打印一个包含所有 3 个输入框的值的语句。我会用 this.state 访问它们吗?但是我如何根据 len 渲染它们?
    猜你喜欢
    • 1970-01-01
    • 2019-12-15
    • 2017-05-21
    • 2019-07-03
    • 2020-01-31
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多