npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

smetaniny-react-composite

v1.0.2

Published

Pattern Composite

Downloads

7

Readme

Шаблон "Компоновщик"

Шаблон "Компоновщик" позволяет организовать объекты в древовидную структуру для представления иерархий "часть-целое". Он позволяет клиентам работать с отдельными объектами и их композициями единообразно.

Пакет реализован в рамках изучения паттерна "Компоновщик"

PHP Abstract Factory GitHub

Что это такое?

Шаблон "Компоновщик" используется для того, чтобы сгруппировать объекты в виде дерева, где каждый узел может быть как отдельным объектом, так и контейнером для других объектов. Это упрощает работу с составными структурами, так как операции, применимые к одиночным объектам, могут применяться и к целым группам объектов.

Когда использовать?

  • Когда объекты можно представить в виде древовидной структуры "часть-целое".
  • Когда нужно, чтобы клиентский код одинаково работал как с отдельными объектами, так и с их группами.
  • Когда нужно динамически строить иерархии объектов.

Как это работает?

Компоненты:

  1. Компонент: Общий интерфейс для как одиночных объектов, так и их композиций.
  2. Лист: Представляет отдельные объекты, которые не содержат других объектов.
  3. Контейнер (Композит): Хранит другие объекты (листья или другие контейнеры) и реализует операции, которые могут быть выполнены на этих объектах.
  4. Клиент: Работает с объектами через интерфейс компонента, не зная, является ли объект листом или композитом.

Плюсы

  • Единообразие: Клиенты могут работать с отдельными объектами и их группами через один и тот же интерфейс.
  • Простота управления сложными структурами: Упрощает работу с иерархиями объектов, позволяет легко изменять и расширять структуру.
  • Гибкость: Легко добавлять новые типы компонентов (листьев и контейнеров) без изменения клиентского кода.

Минусы

  • Сложность отладки: Глубокие иерархии могут усложнить отладку и отслеживание ошибок.
  • Переусложнение: Использование "Компоновщика" может привести к чрезмерному усложнению системы, если структура объектов не требует сложной иерархии.
  • Может ухудшить производительность: Работа с большими и сложными композициями может привести к замедлению системы из-за необходимости обхода дерева объектов.

Почему это полезно?

  • Позволяет работать с объектами и их композициями единообразно.
  • Упрощает управление сложными иерархиями объектов.
  • Делает код гибким для добавления новых типов объектов и их структур.

Участники

  • Component (Товар) — базовый интерфейс для всех товаров. Может быть как отдельным товаром (например, футболка), так и категорией товаров (например, "Одежда").
  • Leaf (Товар) — представляет конкретный товар, например, футболку или джинсы. Не имеет потомков.
  • Composite (Категория) — представляет категорию или подкатегорию товаров, которая может содержать как отдельные товары, так и другие категории. Например, категория "Одежда" может содержать подкатегории "Футболки", "Джинсы" и т.д.
  • Client (Клиент) — взаимодействует с товарами и категориями, добавляет товары в корзину и просматривает их.

Отношения

Клиенты используют интерфейс класса Component для взаимодействия с объектами в составной структуре. Если получателем запроса является листовой объект Leaf, то он и обрабатывает запрос. Когда же получателем является составной объект Composite, то обычно он перенаправляет запрос своим потомкам - возможно, с выполнением некоторых дополнительных операций до или после перенаправления.

Паттерн "Компоновщик" может быть использован в различных ситуациях, включая:

  1. Иерархия категорий товаров:

    • Реализация компонентов для категорий и подкатегорий, которые могут рендерить вложенные компоненты.
  2. Композиция товаров:

    • Создание составных компонентов, таких как наборы, которые могут включать другие компоненты товаров.
  3. Расширяемые системы фильтров:

    • Использование состояния и props для реализации многоуровневых фильтров в пользовательском интерфейсе.
  4. Отображение списков товаров:

    • Использование методов .map() для рендеринга списков товаров и категорий в виде компонентов.
  5. Адаптивные интерфейсы:

    • Создание адаптивных интерфейсов с помощью стилей и условного рендеринга для отображения разных типов контента.
  6. Корзина покупок:

    • Управление состоянием корзины с помощью React Hooks (например, useState и useContext) для добавления и удаления товаров.
  7. Управление акциями и скидками:

    • Применение акций в компонентах на основе состояния и props, отображая обновленные цены на товары.
  8. Создание отчетов и анализа:

    • Визуализация данных о продажах с помощью графиков и таблиц, используя библиотеки для построения графиков, такие как Chart.js или D3.js.
import React, {useState} from 'react';
import {
    products,
    Filter,
    ProductList,
    Filters,
} from "react-composite";

/**
 * Компонент CompositeController отвечает за управление состоянием фильтров
 * и отображение списка продуктов на основе выбранных фильтров.
 */
const CompositeController: React.FC = () => {
    // Определяем состояние filters с использованием useState
    const [filters, setFilters] = useState<Filters>({
        category: 'Все',
        name: '',
        priceRange: [0, 10000],
    });

    // Обработчик изменения фильтров
    const handleFilterChange = (newFilters: Filters) => {
        // Обновляем состояние фильтров на основе нового значения
        setFilters(newFilters);
    };

    return (
        <div>
            <h1>Интернет-магазин</h1>
            <Filter filters={filters} onFilterChange={handleFilterChange} />
            <ProductList products={products} filters={filters} />
        </div>
    );
};

// Экспортируем компонент для использования в других частях приложения
export default CompositeController;