如何从输入中获取价值?

Posted

技术标签:

【中文标题】如何从输入中获取价值?【英文标题】:How to get value from input? 【发布时间】:2020-11-14 16:45:01 【问题描述】:

我为找工作做了简单的任务。使用 react 和 redux。当我从输入中获得价值并将它们发送到减速器时,它们就会迷路。等等,没那么容易。 reducer 获取的第一个项目获取道具名称、年龄、类型、索引并返回新状态。好的。但其他物品在途中丢失了道具名称和年龄。什么?他们是怎么做到的? Reducer 返回空 obj 进行渲染。不要在 dispatch 中看 obj,我会返工。

减速器

case 'EDIT_ITEM':
            console.log(action.name, action.age, action.id);
            return state.map((item, index) =>
                action.id === index
                    ? 
                        name: action.name,
                        age: action.age
                    
                    : item
            );

App.js

function EditUsers() 
        const listItems = users.map(function (value, index) 
            return (
                <form>
                    <div className="input-group">
                        <div className="input-group-prepend">
                            <span className="input-group-text">value.name, value.age</span>
                        </div>
                        <input type="text" placeholder="New name" id="newName" className="form-control"/>
                        <input type="text" placeholder="New age" id="newAge" className="form-control" aria-describedby="button-addon2"/>
                        <div className="input-group-append">
                            <button onClick=() => dispatch(
                                type: 'EDIT_ITEM',
                                id: index,
                                name: document.getElementById('newName').value,
                                age: document.getElementById("newAge").value
                            )
                                    className="btn btn-outline-primary"
                                    type="button"
                                    id="button-addon2">
                                Изменить
                            </button>
                        </div>
                    </div>
                </form>
            )
        );
        return (
            <div>listItems</div>
        )
    

【问题讨论】:

您不应该使用document.getElementById 来获取输入值。在反应中,您应该使用controlled component 来管理输入值。 或者,您可以保持输入不受控制,使按钮的类型为“提交”并将逻辑移动到表单的onSubmit 回调并使用提交事件来访问表单字段。 我不知道 Hooks 是什么样子的,我 e.target.name.valuethis.input.name.value? e.target.value 就足够了。 e.target 指向事件发生的 DOM 元素,所以 e.target.value 是字段中的值 【参考方案1】:

您将无法从按钮的 onClick 事件访问输入值,但如果您决定让输入不受控制并将逻辑移动到关联表单的 onSubmit 回调,那么您可以访问表单的onSubmit 事件中的字段值。

定义一个submitHandler 函数来使用index 和提交事件e

const submitHandler = index => e => 
  e.preventDefault(); // <-- prevent the default form action, important!
  const  newName, newAge  = e.target; // <-- destructure the inputs from the event target

  dispatch(
    type: "EDIT_ITEM",
    id: index,
    name: newName.value, // <-- extract the input value
    age: newAge.value // <-- extract the input value
  );
;

这里输入值的路径是e.target.&lt;fieldId&gt;.value。请注意,我还定义了 submitHandler 来对索引进行柯里化,这可以在映射元素时实现更优化的使用。

接下来,将submitHandler 回调附加到表单的onSubmit 属性。

const listItems = users.map(function(value, index) 
  return (
    <form key=index onSubmit=submitHandler(index)>
      ...

这里的柯里化函数 submitHandler(index) 获取索引并将其包含在回调实例中,返回一个接受 onSubmit 事件对象 e =&gt; ... 的函数。

最后,将按钮更新为具有type="submit" 而没有onClick 处理程序。

<button
  className="btn btn-outline-primary"
  type="submit"
  id="button-addon2"
>
  Изменить
</button>

完整代码

const submitHandler = index => e => 
  e.preventDefault();
  const  newName, newAge  = e.target;

  dispatch(
    type: "EDIT_ITEM",
    id: index,
    name: newName.value,
    age: newAge.value
  );
;

function EditUsers() 
  const listItems = users.map(function(value, index) 
    return (
      <form key=index onSubmit=submitHandler(index)>
        <div className="input-group">
          <div className="input-group-prepend">
            <span className="input-group-text">
              value.name, value.age
            </span>
          </div>
          <input
            type="text"
            placeholder="New name"
            id="newName"
            className="form-control"
          />
          <input
            type="text"
            placeholder="New age"
            id="newAge"
            className="form-control"
            aria-describedby="button-addon2"
          />
          <div className="input-group-append">
            <button
              className="btn btn-outline-primary"
              type="submit"
              id="button-addon2"
            >
              Изменить
            </button>
          </div>
        </div>
      </form>
    );
  );
  return <div>listItems</div>;

【讨论】:

谢谢你太棒了!我想知道是否存在从input 获取value 的另一个方法,为此我问了我的问题 请告诉我为什么将key=index 发送到&lt;form/&gt;?这意味着每个元素都有一个独立的&lt;form/&gt;? @d2207 是的,因为您正在映射用户,所以映射的数组需要每个外部元素上的唯一反应键。每个用户都有自己的表单元素。

以上是关于如何从输入中获取价值?的主要内容,如果未能解决你的问题,请参考以下文章

如何从输入中获取价值而无需提交并从datalist中搜索

从android中动态创建的edittext获取价值?

如何使用密码生成器的 if 语句从用户获取点击功能的价值?

从文本文件中获取价值

如何从网页获取谷歌扩展的价值

如何从Laravel 5.2中的textarea获得价值?