3

I have the below array of objects:

  const [rows, setRows] = useState([
     {id: 1, key: "key1", value: "value1"},
     {id: 2, key: "key2", value: "value2"}
  ]);

And I have the below inputs as well:

<TextField name="key" onChange={(e)=> handleTable(e, record.id)} value{rows.filter...}/>

<TextField name="value" onChange={(e)=> handleTable(e, record.id)} value{rows.filter...}/>

Now I know that for handling the above inputs I should loop to find the appropriate object based on its ID then try to update it, I need one another for loop for the value of the above inputs as well, but that takes a long time in terms of hooks and reloading each time the user enters something, how can I handle the above situation, both updating and showing the appropriate item in the array?

3
  • Doesn't seem like there is any other way of doing this Commented Jan 24, 2022 at 10:41
  • from where you're passing record.id, also attach the handleTable function. Commented Jan 24, 2022 at 10:46
  • Can you show the code about the update of rows and 'for loop' for value? I think there is a way to merge that. maybe!! Commented Jan 24, 2022 at 10:56

3 Answers 3

2

Yes, you need to loop the textfields and pass the index to the change handler.

const [rows, setRows] = React.useState([
    { id: 1, key: "key1", value: "value1" },
    { id: 2, key: "key2", value: "value2" }
    ]);

   const handleChange = (e,idx) => {
    clone = [...rows];
    let obj = clone[idx];
    obj.value = e.target.value;
    clone[idx] = obj;
    setRows([...clone])
   }

and Then you need to loop your rows with text field.

 { rows?.map((row, index) => 
     <TextField value={rows[index]?.value} onChange={(e) => 
        handleChange(e,index)} /> 
     )}  

This may help you to tweak your solution.

Sign up to request clarification or add additional context in comments.

4 Comments

Can we change one from rows' items without using setRows?
React will only rerender the component if there is any state change. you can use useCallBack,useMemo to avoid from rerendring for performance purpose.
I'm using Ant Design table which is not headless, hence, I can not loop through my array of objects, however, I realized I'm setting IDs to be start from 1, I made it 0 and now I can get my proper index by simply using rows[record.id], but the way you are updating the rows, IDK if you have actually tried it or not, but when I tend to write in the input, the focus jumps off and again I should refocus the cursor on the input to write the next letter, I'm currently looking for a better and cleaner way to update the rows. btw thanks for your time.
I'll give it a try to fix the focus out issue. Thanks for pointing out.
2
  const [rows, setRows] = useState([
  { id: 1, key: "key1", value: "value1" },
  { id: 2, key: "key2", value: "value2" }
]);

const handleTable = (e, id) => {
  const newRows = [...rows]; //spread the rows array into a new array
  const index = rows.find((item, i) => {
    if (item.id === id) return i;
  }); //found the index using the id

  if (e.target.name === "key") {
    newRows[index].key = e.target.value; // update using the index
  } else {
    newRows[index].value = e.target.value;
  }

  setRows(() => [...newRows]);
};

<TextField name="key" onChange={(e)=> handleTable(e, record.id)} value{rows.filter...}/>

<TextField name="value" onChange={(e)=> handleTable(e, record.id)} value{rows.filter...}/>

Comments

0

if there is a better way plz edit

const [value , setValue]=useState([])

in html :

*need separate state for each input elements

<input value={value[key] ? value[key] : ""} onChange={(e) => handleSetValue(e.target.value, key)}/>

set value func() :

 function handleSetValue(e, key) {
        setValue(s => {
            const newArr = s.slice();
            newArr[key] = e;

            return newArr;
        });
    }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.