В част 2 на тази ще продължим от мястото, където спряхме, където създадохме компонентите, от които се нуждаем, и сега ще започнем с изобразяване на списък.

Тъй като повечето от основните настройки на файловете и компонентите са готови, време е да се захванем с някои от по-забавните неща на React с предаване на подпори, състояние на обработка и много JSX!

Създаване на масив с вложен хеш с някои твърдо кодирани данни, зададени като константа от контакти в App.js:

const contacts = [
  {
    id: "1",
    name: "Shane",
    email: "[email protected]",
  },
  {
    id: "2",
    name: "Tanner",
    email: "[email protected]",
  },
];

Сега предаваме масива с контакти като опора на компонента ContactList:

return (
  <div>
    <Header />
    <AddContact />
    <ContactList contacts={contacts} />
  </div>
);

В компонента ContactList, ако предадем props като аргумент и конзолата го регистрира, трябва да можете да видите данните от масива на контактите в конзолата:

const ContactList = (props) => {
  console.log(props);
  return <div>Contact List</div>;
};
export default ContactList;

Създаване на друга постоянна променлива, където ще картографираме масива с контакти, за да структурираме как ще се показват данните на всеки отделен контакт:

const renderContactList = props.contacts.map((contact => {
  return (
    <div>
      <div>
        <div>{contact.name)</div>
        <div>{contact.email}</div>
      </div>
    </div>
  );
})
  • Вложени div за целите на CSS стилизиране по-късно.

Позоваване на новата константа в JSX в връщането на ContactList:

return <div>
  {renderContactList}
</div>

В този момент трябва да видите списъка изведен.

Създаване на компонента ContactCard, където ще преместим кода, който управлява начина, по който данните за контакт ще бъдат показани от ContactList в него:

import React from 'react';
const ContactCard = () => {
  return (
    <div>
      <div>
        <div>{contact.name}</div>
        <div>{contact.email}</div>
      </div>
    </div>
  );
};
export default ContactCard;

Предаване на подпори от ContactList към ContactCard чрез импортиране на ContactCard в ContactList:

import React from 'react';
import ContactCard from './ContactCard.js';
const ContactList = (props) => {
  console.log(props);
const renderContactList = props.contacts.map((contact => {
  return <ContactCard contact={contact} />;
});

И предаване на подпори към ContactCard:

const ContactCard = (props) => {
  return (
    <div>
      <div>
        <div>{contact.name}</div>
        <div>{contact.email}</div>
      </div>
    </div>
  );
};

Настройване на друга постоянна променлива в ContactCard, за да улесните извикването на атрибутите на контакт, след което можете да промените извикванията на „contact.name“ и „contact.email“ само на име и имейл:

const { id, name, email } = props.contact;

В рамките на App.js, премахване на твърдо кодираните данни за контакт и прилагане на метода useState React:

import React, { useState } from 'react';
...
function App() {
  const [contacts, setContacts]= useState([]);
...

Искаме да можем да добавим нов контакт към списъка, когато щракнете върху „Добавяне“ след попълване на формуляра, така че нека добавим състояние към компонента на класа:

class AddContact extends React.component {
  state = {
    name: "",
    email: "",
  };
...
<input 
  type="text" 
  name="name" 
  placeholder="Name"
  value={this.state.name} 
  onChange={(e) => this.setState({name: e.target.value})
/>
...
<input 
  type="text" 
  name="email" 
  placeholder="Email"
  value={this.state.email} 
  onChange={(e) => this.setState({email: e.target.value})
/>

Създаване на функция със стрелка „добавяне“ за обработка на логиката на добавяне на нов контакт в рамките на същия компонент:

...
add = (e) => {
  e.preventDefault();
  if(this.state.name === "" || this.state.email === "") {
    alert("Make sure to fill in all fields!")
    return;
  }
  console.log(this.state);
};
render() {
...
  <form onSubmit={this.add}>
...

Предаване на реквизит от детето към родителя:

function App() {
...
<AddContact addContactHandler={addContactHandler} />

Дефиниране на addContactHandler в App.js и само контакт за регистриране в конзолата за сега:

const addContactHandler = (contact) => {
  console.log(contact);
};

Използвайки манипулатора, който предадохме от компонента App във функцията за добавяне в компонента AddContact, както и задаване на състоянието, така че полетата да се изчистват при добавяне на нов контакт:

add = (e) => {
  e.preventDefault();
  if(this.state.name === "" || this.state.email === "") {
    alert("Make sure to fill in all fields!")
    return;
  }
  this.props.addContactHandler(this.state);
  this.setState({ name: "", email: "" });
};

Използване на setContact за актуализиране на състоянието в компонента на приложението:

const addContactHandler = (contact) => {
  console.log(contact);
  setContacts([...contacts, contact]);
};

Когато попълним формуляра и натиснете „Добави“, новият контакт вече е създаден и показан! Но когато страницата бъде опреснена, новият контакт ще изчезне, тъй като все още трябва да го запазим, когато бъде създаден в нещо като localStorage. Точно оттам ще започнем при следващото влизане в тази серия. Благодаря ви, че прочетохте и се надявам, че те са ви от полза във вашата практика на кодиране на React! Приятно кодиране!

GitHub: