Во второй части мы продолжим с того места, где остановились, где создали необходимые нам компоненты, и теперь мы начнем с рендеринга списка.

Поскольку большая часть базовой настройки файлов и компонентов готова к работе, пришло время заняться некоторыми более интересными вещами 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! Удачного кодирования!

Гитхаб: