Mengedit State Induk dalam Komponen Anak di React
Sekarang mari kita edit produk kita menggunakan input. Untuk melakukan ini, dalam komponen anak marilah kita buat satu butang.
Pada tekanan pertama butang ini, biarkan bukannya nama dan harga dengan produk, input muncul untuk mengeditnya, dan pada tekanan kedua sebaliknya input, teks muncul semula.
Mari kita buat perubahan pada tatasusunan dengan produk, menambahkan
properti isEdit (dan kerja dengan troli
untuk kesederhanaan kita keluarkan):
const initProds = [
{id: id(), name: 'product1', cost: 100, isEdit: false},
{id: id(), name: 'product2', cost: 200, isEdit: false},
{id: id(), name: 'product3', cost: 300, isEdit: false},
];
Komponen Product
Mari buat butang untuk mengedit dalam produk:
function Product({ id, name, cost, isEdit }) {
return <div>
name: <span>{name}</span>
cost: <span>{cost}</span>
<button>edit</button>
</div>;
}
Mari kita buat supaya apabila diklik pada butang ini
satu fungsi toggleMode dipanggil,
yang dihantar dari komponen induk:
function Product({ id, name, cost, isEdit, toggleMode }) {
return <div>
name: <span>{name}</span>
cost: <span>{cost}</span>
<button onClick={() => toggleMode(id)}>
edit
</button>
</div>;
}
Kita masih belum mempunyai pelaksanaan toggleMode,
tetapi kita tahu bahawa ia akan terletak
dalam komponen induk, menerima parameter
id produk dan mengubah properti isEdit
produk kepada yang bertentangan.
Mari kita juga buat supaya teks butang berubah setiap kali ditekan:
function Product({ id, name, cost, isEdit, toggleMode }) {
return <div>
name: <span>{name}</span>
cost: <span>{cost}</span>
<button onClick={() => toggleMode(id)}>
{isEdit ? 'save': 'edit'}
</button>
</div>;
}
Sekarang mari kita buat supaya dalam mod mengedit kita ada input dengan data, dan dalam mod biasa - span:
function Product({ id, name, cost, isEdit, toggleMode }) {
return <div>
name: {isEdit ? <input value={name} /> : <span>{name}</span>}
cost: {isEdit ? <input value={cost} /> : <span>{cost}</span>}
<button onClick={() => toggleMode(id)}>
{isEdit ? 'save': 'edit'}
</button>
</div>;
}
Mari kita ikat ke input kita acara onChange,
di mana kita akan memanggil beberapa fungsi induk
editProd:
function Product({ id, name, cost, isEdit, toggleMode, editProd }) {
return <div>
name: {
isEdit
? <input value={name} onChange={event => editProd(id, 'name', event)} />
: <span>{ name }</span>
}
cost: {
isEdit
? <input value={cost} onChange={event => editProd(id, 'cost', event)} />
: <span>{ cost }</span>
}
<button onClick={() => toggleMode(id)}>
{isEdit ? 'save': 'edit'}
</button>
</div>;
}
Komponen Products
Sekarang mari kita pergi ke komponen Products.
Mari laksanakan di dalamnya fungsi toggleMode:
function toggleMode(id) {
setProds(prods.map(prod => {
if (prod.id === id) {
prod.isEdit = !prod.isEdit;
}
return prod;
}));
}
Juga laksanakan di dalamnya fungsi editProd:
function editProd(id, field, event) {
setProds(prods.map(prod => {
if (prod.id === id) {
prod[field] = event.target.value;
}
return prod;
}));
}
Dalam tag dengan produk, atribut hantarkan
fungsi kita toggleMode dan editProd:
const items = prods.map(prod => {
return <Product
key ={prod.id}
id ={prod.id}
name={prod.name}
cost={prod.cost}
isEdit={prod.isEdit}
toggleMode={toggleMode}
editProd={editProd}
/>;
});
Kod akhir komponen Products
akan menjadi seperti berikut:
function Products() {
const [prods, setProds] = useState(initProds);
function toggleMode(id) {
setProds(prods.map(prod => {
if (prod.id === id) {
prod.isEdit = !prod.isEdit;
}
return prod;
}));
}
function editProd(id, field, event) {
setProds(prods.map(prod => {
if (prod.id === id) {
prod[field] = event.target.value;
}
return prod;
}));
}
const result = prods.map(prod => {
return <Product
key ={prod.id}
id ={prod.id}
name={prod.name}
cost={prod.cost}
isEdit={prod.isEdit}
toggleMode={toggleMode}
editProd={editProd}
/>;
});
return <div>
{result}
</div>;
}
Tugas Praktikal
Lakukan operasi yang sama dengan komponen
Users dan User, yang dibuat oleh anda
dalam pelajaran sebelumnya.