ການສະແດງ Lists
ທ່ານຈະຕ້ອງການສະແດງ component ທີ່ຄ້າຍກັນຈາກຂໍ້ມູນຂອງ collection. ທ່ານສາມາດໃຊ້ JavaScript array methods ເພື່ອຈັດການ array ຂອງຂໍ້ມູນ. ໃນ page ນີ້, ທ່ານຈະໄດ້ໃຊ້ filter()
ແລະ map()
ດ້ວຍ React ເພື່ອ filter ແລະ ແປງ array ຂໍ້ມູນຂອງທ່ານໃຫ້ເປັນ array ຂອງ component.
You will learn
- ວິທີການສະແດງ component ຈາກ array ໂດຍໃຊ້
map()
ຂອງ JavaScript - ວິທີການສະແດງສະເພາະ component ໂດຍໃຊ້
filter()
ຂອງ JavaScript - ເມື່ອໃດ ແລະ ເປັນຫຍັງຕ້ອງໃຊ້ React keys
ການສະແດງຂໍ້ມູນຈາກ arrays
ບອກວ່າທ່ານມີລາຍການຂອງເນື້ອຫາ.
<ul>
<li>Creola Katherine Johnson: mathematician</li>
<li>Mario José Molina-Pasquel Henríquez: chemist</li>
<li>Mohammad Abdus Salam: physicist</li>
<li>Percy Lavon Julian: chemist</li>
<li>Subrahmanyan Chandrasekhar: astrophysicist</li>
</ul>
ຂໍ້ແຕກຕ່າງລະຫວ່າງລາຍການເຫຼົ່ານີ້ແມ່ນເນື້ອຫາ ແລະ ຂໍ້ມູນ. ທ່ານຈະຕ້ອງສະແດງ component ດຽວກັນຫຼາຍລາຍການໂດຍໃຊ້ຂໍ້ມູນທີ່ແຕກຕ່າງກັນເມື່ອສ້າງ interface: ຈາກລາຍການ comment ໄປຈົນເຖິງ gallery ຮູບພາບ profile. ໃນກໍລະນີນີ້, ທ່ານສາມາດເກັບຂໍ້ມູນໃນ object JavaScript ແລະ array ແລະ ໃຊ້ method ເຊັ່ນ map()
ແລະ filter()
ເພື່ອສະແດງລາຍການຂອງ component ຈາກມັນ.
ນີ້ແມ່ນຕົວຢ່າງຂອງວິທີສ້າງລາຍການຈາກ array:
- ຍ້າຍ ຂໍ້ມູນໄປເປັນ array:
const people = [
'Creola Katherine Johnson: mathematician',
'Mario José Molina-Pasquel Henríquez: chemist',
'Mohammad Abdus Salam: physicist',
'Percy Lavon Julian: chemist',
'Subrahmanyan Chandrasekhar: astrophysicist'
];
- Map member
people
ໄປເປັນ array ໃໝ່ຂອງ node JSX,listItems
:
const listItems = people.map(person => <li>{person}</li>);
- Return
listItems
ຈາກ component ທີລວມຢູ່ໃນ<ul>
:
return <ul>{listItems}</ul>;
ນີ້ແມ່ນຜົນລັບ:
const people = [ 'Creola Katherine Johnson: mathematician', 'Mario José Molina-Pasquel Henríquez: chemist', 'Mohammad Abdus Salam: physicist', 'Percy Lavon Julian: chemist', 'Subrahmanyan Chandrasekhar: astrophysicist' ]; export default function List() { const listItems = people.map(person => <li>{person}</li> ); return <ul>{listItems}</ul>; }
ສັງເກດ sandbox ດ້ານເທິງສະແດງ console error:
ທ່ານຈະໄດ້ຮຽນວິທີແກ້ໄຂຂໍ້ຜິດພາດນີ້ໃນພາຍຫຼັງ. ກ່ອນຈະຮອດຂັ້ນຕອນນັ້ນ, ມາເພີ່ມໂຄ່ງສ້າງສຳລັບຂໍ້ມູນຂອງທ່ານ.
ການ filter array ຂອງລາຍການ
ຂໍ້ມູນນີ້ສາມາດຈັດໂຄ່ງສ້າງໄດ້ຫຼາຍຂຶ້ນ.
const people = [{
id: 0,
name: 'Creola Katherine Johnson',
profession: 'mathematician',
}, {
id: 1,
name: 'Mario José Molina-Pasquel Henríquez',
profession: 'chemist',
}, {
id: 2,
name: 'Mohammad Abdus Salam',
profession: 'physicist',
}, {
name: 'Percy Lavon Julian',
profession: 'chemist',
}, {
name: 'Subrahmanyan Chandrasekhar',
profession: 'astrophysicist',
}];
ສົມມຸດວ່າທ່ານຕ້ອງການວິທີສະແດງສະເພາະຄົນທີ່ມີອາຊີບເປັນ 'chemist'
. ທ່ານສາມາດໃຊ້ method JavaScript filter()
ເພື່ອ return ສະເພາະແຕ່ຜູ້ຄົນເຫຼົ່ານັ້ນ. Method ນີ້ໃຊ້ array ຂອງລາຍການ, ສົ່ງຜ່ານ “test” (ຟັງຊັ່ນທີ່ returns true
ຫຼື false
), ແລະ return array ໃໝ່ສະເພາະລາຍການທີ່ຜ່ານການ test (returned true
).
ທ່ານຕ້ອງການສະເພາະລາຍການທີ່ profession
ເປັນ chemist
ເທົ່ານັ້ນ. ຟັງຊັ່ນ “test” ຈະມີລັກສະນະດັ່ງນີ້ (person) => person.profession === 'chemist'
. ນີ້ແມ່ນວິທີການລວມເຂົ້າກັນ:
- ສ້າງ array ໃໝ່ທີ່ມີແຕ່ຄົນເປັນ “chemist”,
chemists
, ໂດຍການໃຊ້filter()
ໃນpeople
filter ໂດຍperson.profession === 'chemist'
:
const chemists = people.filter(person =>
person.profession === 'chemist'
);
- ທຳການ map ເທິງ
chemists
:
const listItems = chemists.map(person =>
<li>
<img
src={getImageUrl(person)}
alt={person.name}
/>
<p>
<b>{person.name}:</b>
{' ' + person.profession + ' '}
known for {person.accomplishment}
</p>
</li>
);
- ສຸດທ້າຍ, return
listItems
ຈາກ component ຂອງທ່ານ:
return <ul>{listItems}</ul>;
import { people } from './data.js'; import { getImageUrl } from './utils.js'; export default function List() { const chemists = people.filter(person => person.profession === 'chemist' ); const listItems = chemists.map(person => <li> <img src={getImageUrl(person)} alt={person.name} /> <p> <b>{person.name}:</b> {' ' + person.profession + ' '} known for {person.accomplishment} </p> </li> ); return <ul>{listItems}</ul>; }
ການຈັດລະບຽບລາຍການດ້ວຍ key
ສັງເກດວ່າ sandbox ທັງໝົດດ້ານເທິງສະແດງຂໍ້ຜິດພາດໃນ console:
ທ່ານຕ້ອງໄດ້ໃສ່ key
ໃນແຕ່ລະລາຍການຂອງ array — string ຫຼື number ທີ່ບໍ່ຊໍ້າກັບລາຍການອື່ນໆໃນ array ນັ້ນ:
<li key={person.id}>...</li>
Key ຈະບອກ React ວ່າລາຍການ array ໃດທີ່ແຕ່ລະ component ສຳພັນກັນ, ເພື່ອໃຫ້ສາມາດຈັບຄູ່ໄດ້ໃນພາຍຫຼັງ. ນີ້ມີຄວາມສຳຄັນຫຼາຍຖ້າລາຍການ array ຂອງທ່ານສາມາດຍ້າຍ (ຕົວຢ່າງ ເນື່ອງຈາກການຮຽງລຳດັບ), ເພີ່ມ, ຫຼື ຖືກລຶບ. ການເລືອກ key
ທີ່ດີສາມາດຊ່ວຍໃຫ້ React ສະຫຼຸບສິ່ງທີ່ເກີດຂຶ້ນແທ້, ແລະ ທຳການອັບເດດທີ່ຖືກຕ້ອງກັບ DOM tree.
ແທນທີ່ຈະສ້າງ key ທັນທີ, ທ່ານຄວນລວມມັນໄວ້ໃນຂໍ້ມູນຂອງທ່ານ:
export const people = [{ id: 0, // Used in JSX as a key name: 'Creola Katherine Johnson', profession: 'mathematician', accomplishment: 'spaceflight calculations', imageId: 'MK3eW3A' }, { id: 1, // Used in JSX as a key name: 'Mario José Molina-Pasquel Henríquez', profession: 'chemist', accomplishment: 'discovery of Arctic ozone hole', imageId: 'mynHUSa' }, { id: 2, // Used in JSX as a key name: 'Mohammad Abdus Salam', profession: 'physicist', accomplishment: 'electromagnetism theory', imageId: 'bE7W1ji' }, { id: 3, // Used in JSX as a key name: 'Percy Lavon Julian', profession: 'chemist', accomplishment: 'pioneering cortisone drugs, steroids and birth control pills', imageId: 'IOjWm71' }, { id: 4, // Used in JSX as a key name: 'Subrahmanyan Chandrasekhar', profession: 'astrophysicist', accomplishment: 'white dwarf star mass calculations', imageId: 'lrWQx8l' }];
Deep Dive
ທ່ານຈະເຮັດແນວໃດເມືອແຕ່ລະລາຍການບໍ່ຈຳເປັນຕ້ອງສະແດງພຽງ node ດຽວ, ແຕ່ຕ້ອງມີຫຼາຍ DOM node?
Syntax ສັ້ນ <>...</>
Fragment ບໍ່ອະນຸຍາດໃຫ້ທ່ານສົ່ງ key, ສະນັ້ນທ່ານຕ້ອງ group ເຂົ້າເປັນ <div>
ດຽວ, ຫຼື ໃຊ້ syntax ທີ່ຍາວຂຶ້ນໜ້ອຍໜຶ່ງ ແລະ ຊັດເຈນຫຼາຍຂຶ້ນ <Fragment>
:
import { Fragment } from 'react';
// ...
const listItems = people.map(person =>
<Fragment key={person.id}>
<h1>{person.name}</h1>
<p>{person.bio}</p>
</Fragment>
);
Fragment ຫາຍໄປຈາກ DOM, ສະນັ້ນ, ນີ້ຈະສ້າງລາຍການຂອງ <h1>
, <p>
, <h1>
, <p>
, ແລະ ອື່ນໆ.
ຈະຫາ key
ໄດ້ຈາກບ່ອນໃດ
ແຫຼ່ງຂອງຂໍ້ມູນທີ່ແຕກຕ່າງໃຫ້ແຫຼ່ງທີ່ມາຂອງ key ທີ່ຕ່າງກັນ:
- ຂໍ້ມູນຈາກຖານຂໍ້ມູນ: ຖ້າຂໍ້ມູນຂອງທ່ານແມ່ນມາຈາກຖານຂໍ້ມູນ, ທ່ານສາມາດໃຊ້ keys/IDs ຖານຂໍ້ມູນ, ທີ່ບໍ່ຊໍ້າກັນໂດຍທຳມະຊາດ.
- ຂໍ້ມູນທີ່ສ້າງຂຶ້ນພາຍໃນເຄື່ອງ: ຫາກຂໍ້ມູນຂອງທ່ານຖືກສ້າງຂຶ້ນ ແລະ ມີຢູ່ໃນເຄື່ອງ (ເຊັ່ນ: ບັນທຶກໃນແອັບຈົດບັນທຶກ), ໃຫ້ໃຊ້ໂຕນັບທີ່ເພີ່ມຂື້ນ
crypto.randomUUID()
ຫຼື package ເຊັ່ນuuid
ເມື່ອສ້າງລາຍການ.
ກົດຂອງ keys
- Key ຕ້ອງບໍ່ຊໍ້າກັນທຽບກັບໂຕອື່ນ. ເຖິງຢ່າງໃດກໍຕາມ, ເປັນເລື່ອງປົກະຕິທີ່ຈະໃຊ້ key ດຽວກັນສຳລັບ JSX node ໃນ array ທີ່ແຕກຕ່າງກັນ.
- Key ຕ້ອງບໍ່ປ່ຽນແປງ ຫຼື ຜິດຈຸດປະສົງ! ຢ່າສ້າງມັນໃນຕອນທີ່ກຳລັງສະແດງຜົນ.
ເປັນຫຍັງ React ຕ້ອງການ key?
ຈິນຕະນາການວ່າຟາຍຢູ່ desktop ຂອງທ່ານບໍ່ມີຊື່. ແຕ່ທ່ານຄວນອ້າງອີງເຖິງມັນຕາມລຳດັບ —ຟາຍທຳອິດ, ຟາຍທີ່ສອງ, ແລະ ອື່ນໆ. ທ່ານອາດຈະລຶ້ງກັບມັນ, ແຕ່ເມື່ອທ່ານລຶບຟາຍ, ມັນຈະເຮັດໃຫ້ສັບສົນ. ຟາຍທີ່ສອງຈະກາຍເປັນຟາຍທຳອິດ, ຟາຍທີ່ສາມຈະກາຍເປັນຟາຍທີ່ສອງ ແລະ ອື່ນໆ.
ຊື່ຟາຍໃນໂຟນເດີ ແລະ key JSX ໃນ array ມີຈຸດປະສົງຄ້າຍຄືກັນ. ມັນລະບຸລາຍການລະຫວ່າງກັນໂດຍບໍ່ຊໍ້າກັນ. Key ທີ່ເລືອກມາຢ່າງດີຈະໃຫ້ຂໍ້ມູນຫຼາຍກວ່າຕຳແໜ່ງພາຍໃນ array. ເຖິງວ່າ ຕຳແໜ່ງ ຈະປ່ຽນໄປເນື່ອງຈາກການຮຽງລຳດັບໃໝ່ key
ຈະຊ່ວຍໃຫ້ React ກຳນົດລາຍການໄດ້ຕະຫຼອດອາຍຸການໃຊ້ງານ.
Recap
ໃນ page ນີ້ທ່ານໄດ້ຮຽນ:
- ວິທີຍ້າຍຂໍ້ມູນອອກຈາກ component ແລະ ເຂົ້າສູ່ໂຄ່ງສ້າງຂໍ້ມູນເຊັ່ນ array ແລະ object.
- ວິທີສ້າງຊຸດຂອງ component ທີ່ຄ້າຍຄືກັນດ້ວຍ
map()
ຂອງ JavaScript. - ວິທີສ້າງ array ຂອງລາຍການທີ່ filter ດ້ວຍ
filter()
ຂອງ JavaScript. - ເຫດຜົນທີ່ຕ້ອງຕັ້ງຄ່າ
key
ໃນແຕ່ລະ component ໃນ collection ເພື່ອໃຫ້ React ສາມາດຕິດຕາມແຕ່ລະ component ໄດ້ເຖິງວ່າຕຳແໜ່ງ ຫຼື ຂໍ້ມູນຈະມີການປ່ຽນແປງ.
Challenge 1 of 4: ການແຍກ list ອອກເປັນສອງສ່ວນ
ຕົວຢ່າງນີ້ສະແດງລາຍການຂອງ people ທັງໝົດ.
ປ່ຽນມັນເພື່ອສະແດງລາຍການແຍກກັນສອງລາຍການ: Chemist ແລະ Everyone Else. ຄືກັນກັບກ່ອນໜ້ານີ້, ທ່ານສາມາດກຳນົດໄດ້ວ່າບຸກຄົນເຫຼົ່ານີ້ເປັນ chemist ໂດຍການກວດວ່າ person.profession === 'chemist'
.
import { people } from './data.js'; import { getImageUrl } from './utils.js'; export default function List() { const listItems = people.map(person => <li key={person.id}> <img src={getImageUrl(person)} alt={person.name} /> <p> <b>{person.name}:</b> {' ' + person.profession + ' '} known for {person.accomplishment} </p> </li> ); return ( <article> <h1>Scientists</h1> <ul>{listItems}</ul> </article> ); }