【问题标题】:Handling events on dynamically created <select> dropdown options处理动态创建的 <select> 下拉选项的事件
【发布时间】:2019-11-25 14:07:39
【问题描述】:

假设我有一个返回下拉列表的函数。该函数从某个父级调用,其中父级传入包括状态键、数组和 onChange 在内的道具。下拉列表是从数组中的项目动态创建的。 What I want to happen is, when an option in the dropdown is selected, the parents passed in state key gets updated to the value of whatever was selected.目前,我正在尝试通过设置一个 onClick 处理程序 per 来做到这一点,但这是行不通的。相反,我遇到了没有或未定义的值(下面将详细描述)。

示例流程:

  • Parent 传入 aStateKey(实际状态键)、用作下拉值的数组以及用于更新 aStateKey 的 onChange 函数
  • 下拉菜单是根据传入的数组创建的
  • 选择了一个下拉项
  • aStateKey(作为道具传入)通过传入的 onChange 函数进行更新。

我知道传统的方法是给和 onChange 处理程序,但我在解决如何获得上述期望时遇到了麻烦。

家长

state = { aStateKey: "" };

someArray = ["test", "another test"];

updateField = (name, value) => {
        console.log("Updating field: " + name + " with value: " + value);
    
}

return(
    <div>
        <CreateDropdown name="aStateKey" items={this.someArray} onChange={this.updateField} />
    </div>
);

CreateDropdown

function CreateDropdown(props) {
    const handleClick = event => {
        console.log("changed name:" + event.name + "changed value: " + event.value);
        props.onChange(event.name, event.value);
    };

    return (
        <div>
            <select>
                {props.items.map(field => (
                    <option key={field} value={field} name={props.name} onClick={handleClick}>
                        {field}
                    </option>
                ))}
            </select>
        </div>
    );
}

控制台日志

什么都不显示!但是,如果我将 onClick 从&lt;option&gt; 移动到&lt;select&gt;,即

return (
        <div>
            <select onChange={handleClick}>
                {props.items.map(field => (
                    <option key={field} value={field} name={props.name}>
                        {field}
                    </option>
                ))}
            </select>
        </div>
    );

控制台显示:

更新字段:未定义值:未定义。

更改名称:未定义更改值:未定义

如何实现我想要的行为?

【问题讨论】:

  • OnChange event using React JS for drop down 的副本。请在发布问题之前进行更多研究。您需要将 value 道具传递给 select 元素。并且您需要在处理程序中访问该值。您还需要一个 onChange 选择
  • @JohnRuddell 我相信这个问题不是重复的,因为您链接的问题是关于 OnChange 侦听器的一般问题,我的问题更具体,甚至包括“正确”实施方式的代码这些听众在您链接的问题中陈述。
  • 好吧,您没有正确设置您的听众/正确使用这些值。我会给出一个接受的其他问题的答案:)
  • @JohnRuddell Fair - 您链接的问题的答案也很有用。

标签: javascript reactjs


【解决方案1】:

你的目标表单这个事件是选择并使用 onChange 和你需要的更新函数:

function CreateDropdown(props) {

  return (
     <div>
        <select name={props.name} onChange={e => 
          props.onChange(e.target.name, e.target.value);}>
            {props.items.map(field => (
                <option key={field} value={field} 
                    {field}
                </option>
            ))}
        </select>
     </div>
   );
} 

【讨论】:

    【解决方案2】:

    更新 #1

    handleClick 内部,您正在使用event.nameevent.value 来获取您想要的目标值。

    改为使用event.target.nameevent.target.value


    尝试在您的select 元素中使用onChange 而不是onClick

    它属于 select 而不是 option 元素。

    【讨论】:

    • 感谢您的建议,但是我已经尝试过,并在我的问题中发布了结果行为。
    • 您正在使用onClick 事件处理程序,正如我所建议的,您应该改用onChange
    • 我会更新我的帖子说onChange。无论如何,行为都是一样的。
    • 有一些问题,主要是没有value 传递给选择组件。它是在近距离投票中发布的链接的副本
    • 请检查答案中的 UPDATE #1。
    猜你喜欢
    • 2019-01-29
    • 2016-03-17
    • 2012-04-30
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多