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):
jsxconst 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:
jsxfunction 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:
jsxfunction 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:
jsxfunction 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:
jsxfunction 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:
jsxfunction 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:
jsxfunction toggleMode(id) {
setProds(prods.map(prod => {
if (prod.id === id) {
prod.isEdit = !prod.isEdit;
}
return prod;
}));
}
Juga laksanakan di dalamnya fungsi editProd:
jsxfunction 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:
jsxconst 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:
jsxfunction 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.