Implementierungsschritte zur Kapselung von Komponenten basierend auf React

Implementierungsschritte zur Kapselung von Komponenten basierend auf React

Vorwort

Viele Freunde werden wie ich auf viele Probleme stoßen, wenn sie zum ersten Mal versuchen, Komponenten zu kapseln. Beispielsweise haben die Komponenten anderer Leute Farbattribute. Wenn wir die Komponente verwenden, übergeben wir den im Komponentendokument beschriebenen Attributwert, z. B. „primär“. Dann wird die Schriftfarbe dieser Komponente zur Farbe, die „primär“ entspricht. Wie wird das gemacht? Außerdem haben die von anderen gekapselten Komponentenklassennamen ihre eigenen eindeutigen Präfixe. Wie gehen Sie damit um? Müssen Sie allen CSS-Klassennamen Präfixe hinzufügen? Das ist zu mühsam!

Wenn Sie diese Fragen verwirren, können Sie diesen Artikel lesen.

Ich werde anhand der Teilerkomponente von Antd erklären, wie eine Komponente auf Basis von React gekapselt wird, und einige der oben genannten Fragen beantworten. Bitte lesen Sie es geduldig!

Wie kapselt Antd Komponenten?

Lageradresse

  • Antd-Repository-Adresse: https://github.com/ant-design/ant-design
  • Die Trennkomponente befindet sich im Verzeichnis, das der folgenden Abbildung entspricht (ich werde den Code hierher kopieren. Wenn Sie interessiert sind, können Sie das Repository klonen).

Quellcode der Teilerkomponente

Der Quellcode von antd verwendet die TypeScript-Syntax. Studierende, die die Syntax nicht verstehen, sollten sie daher rechtzeitig lernen!

importiere * als React von „react“;
importiere Klassennamen aus „Klassennamen“;
importiere { ConfigConsumer, ConfigConsumerProps } von '../config-provider';

Exportschnittstelle DividerProps {
    PräfixCls?: Zeichenfolge;
    Typ?: „horizontal“ | „vertikal“;
    Ausrichtung?: ‚links‘ | ‚rechts‘ | ‚Mitte‘;
    Klassenname?: Zeichenfolge;
    Kinder?: React.ReactNode;
    gestrichelt?: Boolesch;
    Stil?: React.CSSProperties;
    einfach?: boolesch;
}

const Divider: React.FC<DividerProps> = props => (
    <Konfigurationsverbraucher>
        {({ getPrefixCls, Richtung }: ConfigConsumerProps) => {
            Konstante {
                PräfixCls: PräfixCls anpassen,
                Typ = "horizontal",
                Ausrichtung = "Mitte",
                Klassenname,
                Kinder,
                gestrichelt,
                schmucklos,
                …restProps
            } = Requisiten;
            const prefixCls = getPrefixCls('Teiler', customizePrefixCls);
            const orientationPrefix = Orientierung.Länge > 0? `-${orientation}`: Orientierung;
            const hatKinder = !!Kinder;
            const classString = Klassennamen(
                PräfixCls,
                `${prefixCls}-${type}`,
                {
                    [`${prefixCls}-mit-text`]: hatKinder,
                    [`${prefixCls}-mit-text${orientationPrefix}`]: hatKinder,
                    [`${prefixCls}-dashed`]: !!gestrichelt,
                    [`${prefixCls}-plain`]: !!plain,
                    [`${prefixCls}-rtl`]: Richtung === 'rtl',
                },
                Klassenname,
            );
            zurückkehren (
                <div className={classString} {...restProps} role="Trennzeichen">
                    {Kinder && <span className={`${prefixCls}-inner-text`}>{Kinder}</span>}
                </div>
            );
        }}
    </Konfigurationsverbraucher>
);

Standardteiler exportieren;

So legen Sie Komponenteneigenschaften offen

Im Quellcode sehen Sie als Erstes den folgenden Inhalt. Diese Eigenschaften sind auch die Eigenschaften, die von der Trennerkomponente bereitgestellt werden. Wir können das Typattribut wie <Divider type='vertical' /> übergeben, sodass der Trennlinienstil des Trenners als vertikale Trennlinie dargestellt wird. Kommt Ihnen das nicht bekannt vor?

Schnittstelle DividerProps exportieren { // Schnittstelle hat TypeScript-Syntax PräfixCls?: Zeichenfolge;
    Typ?: ‚horizontal‘ | ‚vertikal‘; // Typ auf nur einen der beiden Werte beschränken Ausrichtung?: ‚links‘ | ‚rechts‘ | ‚Mitte‘;
    Klassenname?: Zeichenfolge;
    Kinder?: React.ReactNode;
    gestrichelt?: Boolesch;
    Stil?: React.CSSProperties;
    einfach?: boolesch;
}

In den obigen Attributen haben wir auch festgestellt, dass className und style relativ häufige Attribute sind, was bedeutet, dass wir diese Attribute wie folgt verwenden können: <Divider type='vertical' className='myClassName' style={{width: '1em'}} />

So legen Sie ein einheitliches Klassennamenpräfix fest

Wir wissen, dass die Komponentenklassennamen von Antd ihr eigenes eindeutiges Präfix ant- haben. Wie wird dies gehandhabt? Schauen Sie sich weiterhin den Quellcode an.

<Konfigurationsverbraucher>
    {({ getPrefixCls, Richtung }: ConfigConsumerProps) => {
        Konstante {
            PräfixCls: PräfixCls anpassen,
            Typ = "horizontal",
            Ausrichtung = "Mitte",
            Klassenname,
            Kinder,
            gestrichelt,
            schmucklos,
            …restProps
        } = Requisiten;
        const prefixCls = getPrefixCls('Teiler', customizePrefixCls);

Im Quellcode finden wir prefixCls, das von der Methode getPrefixCls generiert wird. Sehen wir uns den Quellcode der Methode getPrefixCls wie folgt an.

Schnittstelle ConfigConsumerProps exportieren {
  ...
  getPrefixCls: (suffixCls?: Zeichenfolge, customizePrefixCls?: Zeichenfolge) => Zeichenfolge;
  ...
}

const defaultGetPrefixCls = (suffixCls?: Zeichenfolge, customizePrefixCls?: Zeichenfolge) => {
  wenn (PrefixCls anpassen) returniere „PrefixCls anpassen“;

  SuffixCls zurückgeben? `ant-${suffixCls}`: 'ant';
};

Es ist nicht schwer herauszufinden, dass das zu diesem Zeitpunkt generierte Klassennamenpräfix ant-divider ist .

Umgang mit Stilen und Klassennamen

Die von uns gekapselten Komponenten müssen über voreingestellte Stile verfügen. Da die Stile durch Klassennamen definiert werden und die von uns übergebenen Attributwerte bestimmen, welcher Klassenname der Komponente hinzugefügt werden soll, wie wird dies erreicht? Schauen wir uns den Quellcode unten an.

importiere Klassennamen aus „Klassennamen“;

const classString = Klassennamen(
    PräfixCls,
    `${prefixCls}-${type}`,
    {
        [`${prefixCls}-mit-text`]: hatKinder,
        [`${prefixCls}-mit-text${orientationPrefix}`]: hatKinder,
        [`${prefixCls}-dashed`]: !!gestrichelt,
        [`${prefixCls}-plain`]: !!plain,
        [`${prefixCls}-rtl`]: Richtung === 'rtl',
    },
    Klassenname,
);
zurückkehren (
    <div className={classString} {...restProps} role="Trennzeichen">
        {Kinder && <span className={`${prefixCls}-inner-text`}>{Kinder}</span>}
    </div>
);

Wir haben festgestellt, dass es eine Konstante aller Klassennamen über die Methode classNames definiert (classNames ist eine Komponente von React, die mehrere Klassennamen verarbeitet) und diese dann an das className-Attribut im div übergibt.

Tatsächlich lautet der generierte Klassenname ant-divider-horizontal , sodass der in CSS mit diesem Klassennamen definierte Stil natürlich wirksam wird. Die Attribute className und style werden über {...restProps} übergeben.

Schauen wir uns abschließend an, wie der Code im CSS-Stil geschrieben ist!

Quellcode des Teilerkomponentenstils

Die Stile der Antd-Komponenten sind in Less geschrieben. Studenten, die mit der Less-Syntax nicht vertraut sind, müssen sich damit vertraut machen.

@import '../../Stil/Themen/Index';
@import '../../style/mixins/index';

@divider-prefix-cls: ~'@{ant-prefix}-divider'; // Sie können sehen, dass dies dem zuvor erwähnten Klassennamenpräfix entspricht.@{divider-prefix-cls} {
  .reset-Komponente();

  Rahmen oben: @border-width-base solid @divider-color;

  &-vertical { // Der vollständige Klassenname ist hier eigentlich ant-divider-vertical. Dies ist der Stil, der der Trennkomponente entspricht, wenn der Wert des Typattributs vertikal ist. Position: relative;
    oben: -0,06em;
    Anzeige: Inline-Block;
    Höhe: 0,9em;
    Rand: 0,8px;
    vertikale Ausrichtung: Mitte;
    Rahmen oben: 0;
    Rahmen links: @border-width-base solid @divider-color;
  }

  &-horizontal {
    Anzeige: Flex;
    klar: beides;
    Breite: 100 %;
    Mindestbreite: 100 %; 
    Rand: 24px 0;
  }

  &-horizontal&-mit-Text {
    Anzeige: Flex;
    Rand: 16px 0;
    Farbe: @Überschriftenfarbe;
    Schriftstärke: 500;
    Schriftgröße: @font-size-lg;
    Leerzeichen: Nowrap;
    Textausrichtung: zentriert;
    Rahmen oben: 0;
    Farbe des oberen Rahmens: @Teilerfarbe;

    &::vor,
    &::nach {
      Position: relativ;
      oben: 50 %;
      Breite: 50%;
      Rahmen oben: @border-width-base durchgehend transparent;
      // Chrome akzeptiert kein „inherit“ in „border-top“
      Rahmenoberseite-Farbe: erben;
      Rahmen unten: 0;
      transformieren: übersetzenY(50%);
      Inhalt: '';
    }
  }

  &-horizontal&-mit-Text-links {
    &::vor {
      oben: 50 %;
      Breite: @divider-orientation-margin;
    }

    &::nach {
      oben: 50 %;
      Breite: 100 % – @divider-orientation-margin;
    }
  }

  &-horizontal&-mit-Text-rechts {
    &::vor {
      oben: 50 %;
      Breite: 100 % – @divider-orientation-margin;
    }

    &::nach {
      oben: 50 %;
      Breite: @divider-orientation-margin;
    }
  }

  &-innerer-text {
    Anzeige: Inline-Block;
    Polsterung: 0 @divider-text-padding;
  }

  &-gestrichelt {
    Hintergrund: keiner;
    Rahmenfarbe: @Teilerfarbe;
    Rahmenstil: gestrichelt;
    Rahmenbreite: @border-width-base 0 0;
  }

  &-horizontal&-mit-Text&-gestrichelt {
    Rahmen oben: 0;

    &::vor,
    &::nach {
      Rahmenstil: gestrichelt, keine, keine;
    }
  }

  &-vertikal&-gestrichelt {
    Rahmenbreite: 0 0 0 @border-width-base;
  }

  &-plain&-mit-text {
    Farbe: @Textfarbe;
    Schriftstärke: normal;
    Schriftgröße: @font-size-base;
  }
}

@import './rtl';

Auf diese Weise glaube ich, dass die Studierenden auch ein allgemeines Verständnis davon haben, wie man eine Komponente kapselt und was die wichtigsten Punkte sind. Es gibt noch viele Stellen im Quellcode, die es wert sind, gelernt zu werden, wie beispielsweise die Definition und Verwendung von ConfigConsumer hier. Interessierte Studierende sind herzlich eingeladen, miteinander zu kommunizieren.

Dies ist das Ende dieses Artikels über die Implementierungsschritte von React-basierten gekapselten Komponenten. Weitere relevante Inhalte zu React-gekapselten Komponenten finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Kapseln Sie eine einfachste ErrorBoundary-Komponente zur Behandlung von React-Ausnahmen
  • Kapselung der Implementierung von React Form-Komponenten
  • React-Tutorial: So kapseln Sie eine wiederverwendbare Portal-Komponente
  • Kapselung der vertikalen Karussellkomponente für React Native-Benachrichtigungsnachrichten
  • Wissen Sie, wie Sie eine auf React basierende Komponente kapseln?

<<:  Erläuterung der Methode zum Schreiben von SQL-Anweisungen zum Einfügen

>>:  So passen Sie die Protokollebene von Nginx in Docker an

Artikel empfehlen

So setzen Sie Ihr Linux-Passwort zurück, wenn Sie es verloren haben

1. Das Startmenü besteht darin, den Cursor in die...

Lösung für das Problem „Linux QT Kit fehlt“ und „Version leer“

Derzeit tritt ein solches Problem auf Bei mir war...

So zeichnen Sie eine Schaltfläche in XAML als Kreis neu

Beim Verwenden des XAML-Layouts müssen manchmal ei...

So ändern Sie den Benutzer und die Gruppe einer Datei in Linux

Wenn unter Linux eine Datei erstellt wird, ist de...

So erweitern Sie den Speicherplatz eines Linux-Servers

Inhaltsverzeichnis Vorwort Schritt Vorwort Heute ...

Nginx implementiert ein Codebeispiel für die https-Websitekonfiguration

https-Basisport 443. Er wird für etwas verwendet,...

Probleme und Lösungen für MYSQL5.7.17-Verbindungsfehler unter MAC

Das Problem, dass MYSQL5.7.17 unter MAC keine Ver...

So erstellen Sie eine Ansicht für mehrere Tabellen in MySQL

Erstellen Sie in MySQL eine Ansicht für zwei oder...

Detaillierte Erklärung zur Verwendung des Schlüsselworts ESCAPE in MySQL

MySQL-Escape Escape bedeutet die ursprüngliche Se...

Das WeChat-Applet zeichnet die Bewegungsbahn des Benutzers auf

Inhaltsverzeichnis Konfiguration hinzufügen JSON-...

RHCE installiert Apache und greift mit einem Browser auf IP zu

1. at ist so konfiguriert, dass nach 5 Stunden „D...

Linux-Befehl „cut“ erklärt

Der Cut-Befehl in Linux und Unix dient dazu, aus ...