This a small functional component. A list is rendered in a input. Tried changing the key but it dint worked. I am having issues in reflecting Input text changes.
import { useState } from "react";
import "./styles.css";
export default function App() {
const [list, setList] = useState([
{ id: 1, text: "abc" },
{ id: 1, text: "zxy" }
]);
const setText = (e, id) => {
setList((old) => {
old[id].text = e.target.value;
console.log(old)
return old;
});
};
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<h2>Edit to see some magic happen!</h2>
{list.map((li, index) => (
<input
key={index}
value={li.text}
onChange={(e) => setText(e, index)}
/>
))}
</div>
);
}
const { useState } = React;
function App() {
const [list, setList] = useState([
{ id: 1, text: "abc" },
{ id: 1, text: "zxy" }
]);
const setText = (e, id) => {
setList((old) => {
old[id].text = e.target.value;
console.log(old)
return old;
});
};
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<h2>Edit to see some magic happen!</h2>
{list.map((li, index) => (
<input
key={index}
value={li.text}
onChange={(e) => setText(e, index)}
/>
))}
</div>
);
}
ReactDOM.render(<App />, document.querySelector("#app-container"));<script src="https://unpkg.com/react@17/umd/react.production.min.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script> <div id="app-container"></div>
Advertisement
Answer
In such case, You need to update your list field(text) based on typed matched object by Id or other unique field.
export default function App() {
const [list, setList] = useState([
{ id: 1, text: "" },
{ id: 1, text: "" }
]);
const setText = (e, id) => {
const { value } = e.target;
setList((lists) => lists?.map((list, index) =>
index === id ? { ...list, text: value } : list
));
};
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<h2>Edit to see some magic happen!</h2>
{list.map((li, index) => (
<input
key={index}
value={li.text}
onChange={(e) => setText(e, index)}
/>
))}
</div>
);
}