我正在开发一个Reaction应用程序,其中有一个带有 Select 下拉列表的表单.当用户点击"编辑"按钮时,我希望在 Select 下拉列表中将所选产品记录的"UOM"字段的值设置为默认值.此外,我希望动态地将‘UnitMasterData’数组中的剩余值追加到缺省值之后.目前,我的代码使用来自‘UnitMasterData’的所有值填充SELECT下拉列表,而不设置默认值.如何实现此功能?

我在下面附上我的代码-

import React, { useEffect, useState } from 'react';
import { useNavigate, generatePath, Link, BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import { Navbar, Nav, NavDropdown } from 'react-bootstrap';
import 'bootstrap/dist/css/bootstrap.min.css';
import axios from 'axios';
import Swal from 'sweetalert2';
import withReactContent from 'sweetalert2-react-content';
import DataTable from 'react-data-table-component';
import { useParams } from 'react-router';
import FormRange from 'react-bootstrap/esm/FormRange';

function App() {

  const MySwal = withReactContent(Swal)

  const [formData, setFormData] = useState({
    productid1: '',
    product_name1: '',
    product_category1: '',
    uom1: '',
    purchase_rate1: '',
    sales_rate1: '',
    mrp1: '',
    opqty1: '',
    clqty1: '',
    status1: '',
    product_id_hidden1: '',
    operationtype1: 'Add Product'
  });
  
  const handleInputChange = (e) => {
    const { name, value } = e.target;
    setFormData({
      ...formData,
      [name]: value,
    });
  };

  const [UnitMasterData, setUnitMasterData] = useState([]);
  //2) using axios
  useEffect(() => {
  // Fetch data from the specified URL
  axios.get('http://localhost/api_link/codeigniter_part/public/UnitMaster')

    .then((response) => {
        // Access the response data directly using response.data
        setUnitMasterData(response.data.UnitMasterData);
      })
      .catch((error) => console.error('Error fetching data:', error));
  }, []);


  function getdatabyrecordarray(record) {
    // console.log(record.customer_mp_id);
    setFormData({
      productid1: record.productid,
      product_name1: record.product_name,
      product_category1: record.product_category,
      uom1: record.uom,
      purchase_rate1: record.purchase_rate,
      sales_rate1: record.sales_rate,
      mrp1: record.mrp,
      opqty1: record.opqty,
      clqty1: record.clqty,
      status1: record.status,
      operationtype1: 'Edit Customer'
    });
  }

  return (

  <div className="container" style={{color: '#4229cb', fontWeight: '500' ,backgroundColor: 'rgb(255 255 255)'}} >
    <h1 style={{ color: 'white', backgroundColor: '#4229cb', padding: '5px' }} className="text-center"> Product Master</h1>
      <nav style={{ marginTop: -8 }} className="navbar navbar-expand-lg navbar-light bg-light">
        <div className="container-fluid">
          <a className="navbar-brand" href="#">Home</a>  
        </div>  
      </nav>

 <div className="col-md-4">
              <label htmlFor="id-uom" className="form-label">UOM</label>
              <select className="form-select" id="id-uom" name="uom" value = {formData.uom1} onChange = {handleInputChange} >
              {UnitMasterData.map((umd) => (
                <option
                  value={umd.unitname}
                >
                  {umd.unitname}
                </option>
              ))}
              </select>
            </div>
          </div>

    <div className="row mt-4">
      <div className="col-md-12 table-responsive-xl">
        <table className="table table-bordered">
          <thead>
            <tr>
              <th>Prod. Code</th>
              <th>Production Name</th>
              <th>Category</th>
              <th>UOM</th>
              <th>Op Qty</th>
              <th>Cl Qty</th>
              <th>Action</th>
            </tr>
          </thead>
          <tbody>
          {ProductMasterData.map((p) => (

          <tr>
            <td>{p.productid}</td>
            <td>{p.product_name}</td>
            <td>{p.product_category}</td>
            <td>{p.uom}</td>
            <td>{p.opqty}</td>
            <td>{p.clqty}</td>
            <td>
              <button onClick={() => getdatabyrecordarray(p)} className="btn btn-info btn-sm">Edit</button>
              {/* <Link to={generatePath(routes.customerDetails, { customerid1: c.customer_mp_id })}  className="btn btn-success btn-sm">edit</Link> */}

              &nbsp;<button onClick={(event) => confirmDelete(event, p.productid)} className="btn btn-danger btn-sm ml-1">
              Delete
              </button>

            </td>
          </tr>
          ))}
          </tbody>
        </table>
      </div>
    </div>


  </div>
  
  );
}

export default App;

在解决这个问题的同时,考虑到我有限的Reaction经验,我try 了通过‘UnitMasterData’数组进行映射,并使用map函数填充 Select 下拉列表.但是,我无法为所选产品记录的‘UOM’字段设置默认值.我预计SELECT下拉菜单会在顶部显示所选产品记录的‘UOM’值,而在其下方显示‘UnitMasterData’中的剩余值. 我还试图通过向 Select 框添加一个值属性来解决这个问题.虽然这会在顶部成功显示所选记录的UOM值,但它会阻止从下拉列表中 Select 任何其他选项.

推荐答案

我认为您没有提供当前所选记录的uom值作为可选选项.

您不能只使用formData.uom1值,因为您正在 Select 新值并更新表单数据,这会不断地将第一个选项更改为从列表(when a new record isn't being selected)中 Select 的任何其他选项.

  • 添加一个新状态以保存初始的uom
  • Select 记录时更新计量单位默认值
  • 有条件地将此默认单位呈现为第一个选项

示例:

const [defaultUom, setDefaultUom] = useState();

...

function getdatabyrecordarray(record) {
  setDefaultUom(record.uom);

  setFormData({
    productid1: record.productid,
    product_name1: record.product_name,
    product_category1: record.product_category,
    uom1: record.uom,
    purchase_rate1: record.purchase_rate,
    sales_rate1: record.sales_rate,
    mrp1: record.mrp,
    opqty1: record.opqty,
    clqty1: record.clqty,
    status1: record.status,
    operationtype1: 'Edit Customer'
  });
}

...

<select
  className="form-select"
  id="id-uom"
  name="uom1" // <-- should match `formData.uom1` property
  value={formData.uom1}
  onChange={handleInputChange}
>
  {/* uom option from selected record when available */}
  {defaultUom && (
    <option value={defaultUom}>
      {defaultUom}
    </option>
  )}

  {/* dynamically fetched options */}
  {UnitMasterData.map((umd) => (
    <option key={umd.unitname} value={umd.unitname}>
      {umd.unitname}
    </option>
  ))}
</select>

Javascript相关问答推荐

react 路由加载程序行为

我应该在redux reducer中调用其他reducer函数吗?

角色 map 集/spritebook动画,用户输入不停止在键上相位器3

当点击注册页面上的注册按钮时,邮箱重复

在服务器上放置了Create Reaction App Build之后的空白页面

我在我的Java代码中遇到了问题,代码的一部分看不到先前定义的对象

如何通过使用vanilla JS限制字体大小增加或减少两次来改变字体大小

使用领域Web SDK的Vite+Vue应用程序中的Web程序集(WASM)错误

用JS从平面文件构建树形 struct 的JSON

无法避免UV:flat的插值:非法使用保留字"

在Odoo中如何以编程方式在POS中添加产品

将多个文本框中的输出合并到一个文本框中

如何在尚未创建的鼠标悬停事件上访问和着色div?

与在编剧中具有动态价值的定位器交互

在ChartJS中使用spanGaps时,是否获取空值的坐标?

限制数组中每个元素的长度,

在传单的图像覆盖中重新着色特定 colored颜色 的所有像素

ReactJS Sweep Line:优化SciChartJS性能,重用wasmContext进行多图表渲染

如果未定义,如何添加全局变量

Playwright:ReferenceError:browserContext未定义