如何在 React Js 中编辑输入值?

Posted

技术标签:

【中文标题】如何在 React Js 中编辑输入值?【英文标题】:How to edit input value in React Js? 【发布时间】:2021-06-19 18:17:59 【问题描述】:

我正在尝试为我的应用程序创建一个组件,当我单击按钮时,输入字段打开,添加文本后,我再次单击该按钮并打开另一个输入,依此类推。然后所有这些输入的 e.target.value 应该以不同的状态保存并显示在另一个组件中。到目前为止,我能够创建这样的输入,但我不知道如何编辑输入字段。我的代码:

import "./styles.css";
import React,  useState  from "react";

export default function App() 
  const [input, setInput] = useState([]);
  const [data, setData] = useState([]);

  function handleChange(i, e) 
    e.preventDefault();

    setInput([
      
        id: i,
        value: e.target.value
      
    ]);
  

  function handleAddInput() 
    const values = [...input];
    values.push( value: null );
    setInput(values);
  

  const handleSave = () => 
    let value = input?.map((item) => 
      return item.value;
    );
    if (!value || /^\s*$/.test(value)) 
      return;
    

    const newData = [...data, ...input];

    setData(newData);

    setInput([])
  ;

  return (
      <div className="App">
        <button type="button" className="btn" onClick=() => handleAddInput()>
          Add  Input fields
        </button>

        input?.map((input, idx) => 
          return (
            <div key=input.id>
              <input
                type="text"
                placeholder="Enter text"
                onChange=(e) => handleChange(idx, e)
                value=input.value
              />
            </div>
          );
        )

       
    
<h2>Display Added Fields and Edit</h2>
      data?.map((item) => 
        return (
          <>
            <input defaultValue=item.value
            
            
            
            />
          </>
        );
      )

<button className="btn" onClick=handleSave>Save</button>

      data?.map((item) => 
        return (
          <div style= display: "flex", flexDorection: "column", marginTop:"20px" >
            item.value
          </div>
        );
      )
        </div>
  );


codeSandbox

当我单击“添加输入字段”时,弹出新输入,我输入任何输入文本,然后再次单击“添加输入字段”并打开另一个输入,当我单击“保存”按钮时,所有输入值都是保存到状态(作为数据)并显示为输入,之后我可以映射“数据”并显示接收到的输入。就像在图像上我添加了“第一”,然后是“第二”,它们显示得很好,但我不知道如何编辑它们,例如将“第一”更改为“第三”并在保存按钮上“第三”应该显示而不是“第一”。非常感谢任何帮助和建议。

【问题讨论】:

见React onChange event will not fire on custom Input 【参考方案1】:

问题

    使用索引作为 id 不是一个好主意,它们不是唯一的。 handleChange 不会保留现有的输入状态。 React 键的其他各种问题,以及将状态从 input 复制到 data

解决方案

    您不需要输入对象,您可以存储来自输入的字符串原语。这意味着您也不需要 id 属性,按索引更新很简单。 应该使用功能状态更新来更新之前的状态。 我建议使用表单和onSubmit 处理程序来处理更新data 状态数组值。

代码:

function App() 
  const [input, setInput] = useState([]);
  const [data, setData] = useState([]);

  function handleChange(i, e) 
    e.preventDefault();

    setInput((values) =>
      values.map((value, index) => (index === i ? e.target.value : value))
    );
  

  function handleAddInput() 
    setInput((input) => input.concat(""));
  

  const saveHandler = (e) => 
    e.preventDefault();

    // Map all existing form field values
    setData((data) => data.map((_, i) => e.target[i].value));

    // If there are any input values, add these and clear inputs
    if (input.length) 
      setData((data) => data.concat(input));
      setInput([]);
    
  ;

  return (
    <div className="App">
      <button type="button" className="btn" onClick=handleAddInput>
        Add Input fields
      </button>

      input.map((input, idx) => 
        return (
          <div key=idx>
            <input
              type="text"
              placeholder="Enter text"
              onChange=(e) => handleChange(idx, e)
              value=input.value
            />
          </div>
        );
      )

      <h2>Display Added Fields and Edit</h2>
      <form onSubmit=saveHandler>
        data.map((item, i) => 
          return (
            <div key=i>
              <input id=i defaultValue=item />
            </div>
          );
        )

        <button className="btn" type="submit">
          Save
        </button>
      </form>

      data.map((item, i) => 
        return (
          <div
            key=i
            style=
              display: "flex",
              flexDirection: "column",
              marginTop: "20px"
            
          >
            item
          </div>
        );
      )
    </div>
  );

演示

编辑

编辑以生成 GUID 并将 id 属性保持到 data 状态。

    添加新输入字段时生成新的 GUID。 使用id 匹配任何值更新的元素。 保存输入字段时,只需将input 数组复制到data。 在示例中,我还在每一步都渲染了id,因此很明显数据元素仍然是相同的对象。

代码:

function App() 
  const [input, setInput] = useState([]);
  const [data, setData] = useState([]);

  const handleChange = (id) => (e) => 
    e.preventDefault();

    setInput((values) =>
      values.map((el) =>
        el.id === id
          ? 
              ...el,
              value: e.target.value
            
          : el
      )
    );
  ;

  function handleAddInput() 
    setInput((input) =>
      input.concat(
        id: uuidV4(),
        value: ""
      )
    );
  

  const saveHandler = (e) => 
    e.preventDefault();

    setData((data) =>
      data.map((el) => (
        ...el,
        value: e.target[el.id].value
      ))
    );

    if (input.length) 
      setData((data) => data.concat(input));
      setInput([]);
    
  ;

  return (
    <div className="App">
      <button type="button" className="btn" onClick=handleAddInput>
        Add Input fields
      </button>

      input.map((input) => 
        return (
          <label key=input.id>
            input.id
            <input
              type="text"
              placeholder="Enter text"
              onChange=handleChange(input.id)
              value=input.value
            />
          </label>
        );
      )

      <h2>Display Added Fields and Edit</h2>
      <form onSubmit=saveHandler>
        data.map((item) => 
          return (
            <div key=item.id>
              <label>
                item.id
                <input id=item.id defaultValue=item.value />
              </label>
            </div>
          );
        )

        <button className="btn" type="submit">
          Save
        </button>
      </form>

      data.map((item) => 
        return (
          <div
            key=item.id
            style=
              display: "flex",
              flexDirection: "column",
              marginTop: "20px"
            
          >
            <div>
              item.id - item.value
            </div>
          </div>
        );
      )
    </div>
  );

演示 2

【讨论】:

谢谢,这很有帮助。只有一个问题,如何将 id 添加到 [data] 并使其成为对象?像这样 id: 1, value: input @new_reactjs 请检查此updated codesandbox 它使用id 属性的GUID。它不使用传递的索引,而是匹配 id 来更新输入值。 感谢您更新代码,检查并输入有 id,但没有数据。很抱歉一直问,但我不确定如何将 id 添加到数据中,而不是输入。 @new_reactjs 不是将其剥离,而是将input 的全部内容复制到data 中。这需要更新 data 数组元素的显示,因为它们现在也将是对象。我用第二个代码框的更新代码更新了我的答案。请再次检查,希望这会让它更清楚。

以上是关于如何在 React Js 中编辑输入值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React 中将输入值恢复为默认值 onClick?

React js,如何在输入更改时更新状态对象值? [复制]

如何从 React.js 中的多个输入输入字段创建列表?

如何使用react-js以动态形式将复选框值与文本输入绑定?

从 React JS 中的输入字段获取值

如何使用 React Hooks 在另一个组件中获取表单的输入值