代码之家  ›  专栏  ›  技术社区  ›  kovac

如何将对象绑定到输入标记,而不仅仅是使用ReactJS绑定值?

  •  0
  • kovac  · 技术社区  · 8 年前

    我是新手 ReactJS . 我有一个输入标记,当用户在输入中键入时,它会建议可能的值。此建议列表来自一个API,其中列表中的每个项目都具有以下属性:

    item: {
       'id': 'some_id',
       'name': 'some_name',
       'att1': 'some_att_1',
       'att2': 'some_att_2'
    }
    

    在我的代码中,我将“name”属性作为输入中的值,将“id”作为键,如下所示:

    renderItem={(item, isHighlighted) => (
                  <div
                    key={item.id}
                    style={{ background: isHighlighted ? "lightgray" : "white" }}>
                    {item.name}
                  </div>
                )}
    

    到现在为止,一直都还不错。然后我有如下所示的事件处理程序:

    onChange={e => {
                  this.setState({ from: e.target.value });
                  // do something here...
    }}
    onSelect={val => this.setState({ from: val })}
        renderMenu={function(items, value, style) {
           return (
                <div
                style={{ ...style, ...this.menuStyle, zIndex: 10 }}
                children={items}
                />
            );
    }}
    

    如您所见 e.target 我可以访问原始项目的id或名称属性。但是,我需要访问 att1 att2 因为当用户选择输入并单击按钮时,我需要将它们用作参数。我该怎么做?谢谢

    3 回复  |  直到 8 年前
        1
  •  1
  •   Ahsan Ali    8 年前

    您可以使用 find

    onChange={e => {
        this.setState({ from: e.target.value });
        let item = obj.find(val => val.id === e.target.value); // supposing item are your array of objects
    // and e.target.value is the item id
    }}
    

        var obj = [{
            'id': 'some_id',
            'name': 'some_name',
            'att1': 'some_att_1',
            'att2': 'some_att_2'
        },{
            'id': 'some_id1',
            'name': 'some_name1',
            'att1': 'some_att_11',
            'att2': 'some_att_22'
        }
        ];
    
        let item = obj.find(val => val.id === 'some_id1');
        console.log("att1", item.att1);
        console.log("att2", item.att2);
        2
  •  0
  •   Daniel Abdelsamed Dmitry Chirkin    8 年前

    我不完全确定您的组件是如何设置的,所以我将采取一种无论如何都能工作的方法。

    如果您有权访问所选值的ID,并且数据位于数组中,则可以在onChange事件中写入

    onChange={e => {
        this.setState({ from: e.target.value });
    
        // This is where I'm unsure, is your ID e.target.value?
        const id = 0
    
        // I'm only using the first item in the filtered array 
        // because I am assuming your data id's are unique
        const item = items.filter(item=>item.id===id)[0]
    
    
        // Now down here you can access all of the item's data
    
    }}
    
        3
  •  0
  •   Loïc Bellemare-Alford    8 年前

    使用lodash之类的库,您可以使用名称或id找到值。以下是一个示例:

    const items = [{
       'id': 'some_id',
       'name': 'some_name',
       'att1': 'some_att_1',
       'att2': 'some_att_2'
    }]
    
    console.log(_.find(items, { name: 'some_name'}))
    
    /* Returns
    {
      "id": "some_id",
      "name": "some_name",
      "att1": "some_att_1",
      "att2": "some_att_2"
    }
    */
    <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>