Создание обратной ссылки истории и использование моего существующего компонента ссылки

У меня есть определенный общий компонент ссылки (атом, я использую атомарный дизайн для структурирования своего приложения React), который либо возвращает просто <span> с заголовком и значком стрелки, либо, когда у него есть url, он возвращает react-router-dom <Link>.

Я использую react-router-dom v5.

import React from 'react';

import { Link } from 'react-router-dom';

import { Arrow} from 'app/icons';

import { Props } from './MyLink.types';

const MyLink = ({ variant = 'iconRight', text, url }: Props) => {
  const renderLinkBody = () => {
    return (
      <React.Fragment>
        <span css = {styles.label}>{text}</span>
        <Arrow />
      </React.Fragment>
    );
  };

  return url !== undefined ? (
    <Link to = {url} title = {text} >
      {renderLinkBody()}
    </Link>
  ) : (
    <span>{renderLinkBody()}</span>
  );
};

export default MyLink;

Теперь я хочу использовать этот компонент для создания кнопки «Назад» (поведение аналогично кнопке «Назад» в браузере).

Является ли это чистым подходом к передаче реквизита (функции) onClick от родителя к дочернему элементу, например:

const history = useHistory();

<MyLink text = "My title" variant = "iconLeft" onClick = {history.goBack} />

а затем немного настроить компонент MyLink:

 return url !== undefined || onClick ? (
    <Link to = {url} title = {text} onClick = {onClick} >
      {renderLinkBody()}
    </Link>
  ) : (
    <span>{renderLinkBody()}</span>
  );
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что этот подход неплох. При присоединении обработчика onClick к компоненту Link вам, вероятно, потребуется предотвратить поведение ссылки по умолчанию. Вам также нужно будет предоставить действительную опору to компоненту Link при использовании обработчика кликов.

Пример:

const MyLink = ({ variant = "iconRight", onClick, text, url }) => {
  const clickHandler = e => {
    if (onClick) {
      e.preventDefault();
      onClick();
    }
  };

  const renderLinkBody = () => {
    return (
      <>
        <span css = {styles.label}>{text}</span>
        <Arrow />
      </>
    );
  };

  return url !== undefined || onClick ? (
    <Link to = {url || "/"} title = {text} onClick = {clickHandler} >
      {renderLinkBody()}
    </Link>
  ) : (
    <span>{renderLinkBody()}</span>
  );
};

Edit react-creating-a-history-back-link-and-make-use-of-my-existing-link-component

Из-за проблемы с действием onClick и Link вы можете вместо этого сделать навигацию «назад» кнопкой и провести рефакторинг MyLink для условного отображения кнопки, ссылки или диапазона, в зависимости от потребностей.

Другие вопросы по теме