我有一个列出记录的表,并且具有一些更新数据的最低限度的功能.该表如下所示:

const renderTableRows = () => {
    return invoices?.map((invoice, i) => (
      <tr
        key={i}
        onClick={() => handleClick(invoice.ID)}
        className={`${InvoiceStatus_Category(invoice.Status)}`}
      >
        <td>
          <span className={`${InvoiceStatus(invoice.DaysFromDueDate)}`}>O</span>
        </td>
        {/* <td className="choice">{invoice.BillToName}</td>
        <td className="choice">{invoice.InvoiceNumber}</td>
        <td className="choice">{invoice.OFFC}</td> */}
        <td>
          <select
            name="status"
            onChange={(e) => handleStatusOnChange(e, invoice.ID)}
            value={invoice.Status}
            placeholder="Change Status"
          >
            <option value={invoiceStatus}></option>
            <option value="Paid">Paid</option>
            <option value="Post&Hold">Post&Hold</option>
            <option value="Instructions">Instructions</option>
          </select>
        </td>
        <td className="choice">
          <input
            key={i}
            className="matter-input"
            name="matterInput"
            type="text"
            onChange={onChange}
            maxLength={6}
            value={invoice.MatterNo}
          />
        </td>
        <td>
          <button
            className="matter-button"
            onClick={() => {
              buttonOnClick(invoice.ID, matter);
              setMatter("");
            }}
          >
            Add Matter
          </button>
        </td>
      </tr>
    ));
  };

该州正在正确填充,但我无法在输入字段中键入.能在这一栏里打字吗?OnChange事件如下:

const onChange = (e, i) => { const { name, value } = e.target; setMatter(value); };

我甚至试过usRef,但没有成功.

然后,onClick按钮更新API.请参阅以下内容:

const buttonOnClick = (i, mat) => {
if (mat > 0) {
  axios({
    method: "put",
    url: "http://localhost:64198/api/UpdateMatter",
    data: {
      InvoiceID: i,
      Matter: mat,
    },
    headers: { "Content-Type": "application/json" },
  }).then((res) => {
    dispatch(fetchAsyncInvoices());
    setMatter("");
  });
  setMatter("");
  window.location.reload(false);
}

};

I would like to type in the highlighted input boxes for new values enter image description here

推荐答案

您不想在每次输入时都更新REDUX状态 您必须创建一个useState挂钩并将其绑定到您的REDUX状态,然后仅当您需要执行操作时才更新后者:

const [invoicesState, setInvoicesState] = useState([]);
useEffect(() => {
 setInvoicesState(invoices)
},[invoices])

现在,要映射到invoices,您可以映射到invoicesState.
onChange函数应该如下所示:

const onChange = (e, id) => {
  const { value } = e.target;
  setMatter(value);
  setInvoices(prev => prev.map(invoice => {
    if(invoice.ID === id){
      return {
        ...invoice, MatterNo: value
      }
    } else{
      return invoice
    }
  }))
};

因此,您必须将发票的id传递给函数以更新它

<input
  onChange={() => { onChange(e,invoice.ID) }}
/>

and when you click on the button to update anything you just update your redux state not not the local state

Reactjs相关问答推荐

当我在React中使用类方法更新模型的状态时,它在严格模式下触发两次

如何在useEffect中使用useParams()

为什么VScode中的React应用程序无法识别文件夹 struct ?

如何在React中的textarea中显示字符数?

更改购物车中的产品数量后,PayPal Reaction/Next JS按钮未更新

XChaCha20-Poly1305的解密函数

生成Reaction Vite应用程序的停靠容器时无法识别环境变量

在REACT-RUTER-DOMV6中使用通用页面包装组件有问题吗?

在React中映射对象数组时,如何正确呈现JSX.Element或React.ReactNode类型?

为什么在页面重新加载时Location.State变得未定义?

React组件未出现

React Router v6 路径中的符号

我正在try 将一组加载程序函数发送到我的路由,它抛出一个错误 Handler is not a funtion in a reactJs application

React Native Realm 应用程序在发布构建后崩溃

将复杂状态和 setState 传递给更简单的 api

Select 建议后如何关闭 vscode 添加自动完成={}

是什么导致了这个令人惊讶的数组导致 React

如何在 v6.4 中将 Auth0 提供程序与新的 createBrowsereRouter 一起使用?

如何通过 Material Ui 设计将 Accordion 添加到您的 React 项目中?

我想将悬停 colored颜色 更改为红色.写了一个话题,这个元素没有react ,怎么解决呢?