【问题标题】:mapping an array onto the UI is not display elements right将数组映射到 UI 不是正确显示元素
【发布时间】:2021-07-15 03:15:52
【问题描述】:

问题的一些背景:我有一个动态输入字段表单,用户可以通过从下拉菜单中选择一个选项来选择他们所属的社交媒体平台。还有一个相应的文本输入,用户可以在其中输入他们在该社交媒体平台上的用户名。用户可以添加输入字段或删除输入字段,也可以遵循相同的格式。表单在以下屏幕截图中的 UI 上如下所示:

social_media_form_before_deleted_input_field

下面是相关的 JSX 代码:

{socialMediaInputs.map((input, index) =>
                <>
                    <tr className="socialMediaOptionsRow">
                        <td>
                            {index === 0 ? null :
                                <button onClick={event => handleDelete(event, input.id)}>Delete</button>
                            }
                        </td>
                        <td >
                            <select
                                id="socialMediaOptions"
                                onChange={event => handleSocialMediaOptions(event, setIsTextInputDisabled)}
                                required
                                name={input.id}
                            >
                                <option>choose</option>
                                <option name="socialMedia" value={"Twitter"}>Twitter</option>
                                <option name="socialMedia" value={"Facebook"}>Facebook</option>
                                <option name="socialMedia" value={"LinkedIn"}>LinkedIn</option>
                                <option name="socialMedia" value={"Instagram"}>Instagram</option>
                                <option name="socialMedia" value={"Medium"}>Medium</option>
                                <option name="socialMedia" value={"Other"}>Other</option>
                            </select>
                        </td>
                        <td>
                            <input
                                type="text"
                                onChange={handleAccountNameInput}
                                name={input.id}
                                disabled={isTextInputDisabled}
                                required
                            />
                        </td>
                    </tr>
                    <tr>
                       <button 
                          onClick={handleAddBtnClick} 
                          disabled={socialMediaInputs.length >= 5}
                       >
                         <CgMathPlus/>       
                         Add
                       </button>
                    </tr>
                </>

问题是每当我通过按删除按钮删除输入字段时,输入字段确实会从socialMediaInputs 中删除——一个状态值,其中存储了输入字段的所有值并映射到UI,如屏幕截图和代码所示——但它仍然出现在 UI 上。因此,根据上面的屏幕截图,如果我按下具有LinkedIn 的选择选项输入字段的删除按钮,则在 UI 上被删除的不是那个输入字段,而是最后一个输入字段——在这种情况下,选择了Instagram 的选项输入字段。这是该结果的屏幕截图:

social_media_form_after_deleted_input_field

正如您在第二个屏幕截图中看到的那样,包含company: LinkedIn 的对象确实会从socialMediaInputs 中删除,但它仍会出现在 UI 上。当用户单击相应的“删除”按钮时,如何从 UI 中删除输入字段?

这是处理按下删除按钮的 javacript 代码:

const handleDelete = (event, id_) => {
        event.preventDefault();
        const inputs_ = socialMediaInputs.filter(input => input.id !== id_);
        setSocialMediaInputs(inputs_);
    }

编辑:

当我向每个 tr 添加一个键时,当按下删除按钮时,特定的 tr 确实会被删除,但被删除行下方的任何行都会在 UI 上重置。因此,如果我删除选中了Facebook 的行,在下面的第一个屏幕截图中,它确实会被删除。但是它下面的行会被重置——这是我不想要的——在下面的第二个屏幕截图中可以看到。

form_with_key_before_deletion

form_with_key_after_deletion

【问题讨论】:

  • 来自setSocialMediaInputs(inputs_); setSocialMediaInputs 看起来像是一个函数,但在这里socialMediaInputs.map 你正在迭代一个数组
  • 你能用调试器找出inputs_的值吗?这可能应该给你足够的背景来自己找出问题????您还使用了== 而不是===,这是问题所在吗?另一种解决方法是不使用您的 id 开头(仅当您不打算移动下拉菜单时才这样做),只需使用数组索引和 array.splice( index, 1) 删除所需位置的元素。

标签: javascript reactjs jsx


【解决方案1】:

问题是你忘记了key 属性映射一个数组并在 UI 中渲染它。如果没有key,shadow dom 将无法理解数组中的项目已更改。

【讨论】:

  • k,谢谢。那么我应该输入什么作为 key 属性的值呢? setMediaInputs中数组中每个对象的id?
  • Id 可以使用,如果它是唯一的,或者其他唯一的东西
  • 问题解决了吗? @GabeT
  • 有点。我将 id 作为其值的键属性放在每个表行 (tr) 中,但是当我单击删除按钮时,特定行确实会从 UI 中删除,但它下面的所有行都会重置为默认值如果用户在其中输入任何输入,则值。
  • 我在上面加了一些截图
猜你喜欢
  • 2021-03-08
  • 2014-03-04
  • 2020-12-24
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多