W tej części przyjrzymy się, jak definiować atrybuty, pobierać ich wartości i aktualizować. Dzięki atrybutom możemy przyjąć dane wejściowe z edytora, zapisać je i wyprowadzić w dowolny sposób. W poprzednim kroku przyjrzeliśmy się komponentom WordPress, gdzie je znaleźć i jak je wdrożyć. W tym poście dodamy rekwizyty do nawiązania połączenia z atrybutami – zapisanymi danymi.
Definiowanie atrybutów
Atrybuty są dodawane jako obiekty w tablicy do attributes
właściwości w registerBlockType()
. Kluczem każdego atrybutu jest nazwa atrybutu i musisz mieć type
przynajmniej właściwość.
Właściwość type
może być dowolną z poniższych; null
, boolean
, object
, array
, number
, string
, lub integer
.
Opcjonalnie możesz podać właściwość, default
aby zdefiniować początkową wartość atrybutu. Jeśli nie podasz wartości domyślnej, atrybut przyjmie wartość domyślną null
.
Inna właściwość atrybutu source
działa razem z tą selector
właściwością, ale są to drobiazgi, którym przyjrzymy się szczegółowo poniżej.
Na przykład zdefiniowanie dwóch atrybutów; exampleText
jako ciąg i postIds
jako tablica wyglądałaby tak:
Wszystko, co chcesz zapisać dla swojego bloku (dane wejściowe od użytkownika/edytora), wymaga atrybutu. Od Ciebie zależy, jak ustrukturyzujesz swoje dane, definiując osobne atrybuty dla każdego z nich lub łącząc je wszystkie w jeden obiekt. Będzie to tylko różnica w sposobie pobierania ich danych i ich aktualizacji.
Pobieranie wartości atrybutów
Atrybuty są dostępne jako rekwizyty do Twojego bloku edit
i save
funkcji. Jeśli śledziłeś tę serię od poprzedniego kroku, pamiętaj, że zaktualizowaliśmy funkcje, aby przekazywały props jako parametr.
Często destrukturyzuje się atrybuty z rekwizytów, jak zwykle często się do nich odwołujesz. Na przykład wypisanie wywoływanego atrybutu exampleText
wyglądałoby tak:
Aktualizowanie wartości atrybutów
W celu aktualizacji atrybutów mamy dostępną w props metodę o nazwie setAttributes()
. Ta funkcja akceptuje obiekt, do którego możesz dodać dowolny atrybut, który chcesz zaktualizować. Możesz zaktualizować tylko jeden atrybut, więcej lub wszystkie naraz. Jeśli masz zdefiniowanych wiele atrybutów i wywołasz setAttributes()
aktualizację tylko jednego z nich, pozostałe nie zostaną dotknięte.
Jeśli masz doświadczenie z Reactem, prawdopodobnie od razu rozpoznasz podobieństwa między setAttributes()
i setState()
. Działają dokładnie tak samo, ale różnica polega na tym, że stan w React jest po prostu czymś przechowywanym lokalnie w tym komponencie, a atrybuty są w rzeczywistości zapisywane jako dane poza komponentem.
Aby zaktualizować atrybut, zwykle destrukujesz funkcję z właściwości i nazywasz to w ten sposób: Poniżej aktualizujemy exampleText
atrybut na „Hi".
const { setAttributes } = props;
setAttributes({ exampleText: 'Hi' });
Naturalnie uruchomiłbyś setAttributes()
od wewnątrz jakąś akcję. Typowym przykładem jest wnętrze właściwości onChange
w jakimś polu wejściowym, które jest używane do przechowywania wartości exampleText
atrybutu.
Upewnij się, że zapisałeś atrybuty w typie zdefiniowanym w atrybucie. Na przykład nie będziesz miał szczęścia, próbując zapisać obiekty w atrybucie łańcuchowym.
Wypróbujmy to w praktyce! Zainicjuj npm run start
, jeśli jeszcze tego nie zrobiłeś.
Wyświetlanie atrybutu w niestandardowym wprowadzaniu tekstu i aktualizowanie wartości atrybutu
W poprzednim kroku dodaliśmy do edit
, np. wpis tekstowy, ale nic nie zostało zapisane. Dodajmy atrybut i jedno wejście tekstowe dla niego w naszym bloku. Oboje upewnimy się, że wprowadzany tekst pokazuje aktualną wartość, a za każdym razem, gdy dane wejściowe zostaną zmienione, zaktualizujemy atrybut.
Dodawanie tekstu wejściowego i jego onChange
właściwości
Destrukturyzujemy attributes
i korzystamy setAttributes
z props
obu. Następnie korzystamy z TextControl
komponentu z wp.components
pakietu WordPress. Przekazujemy do niego dwa rekwizyty; value
ustawi wartość wejścia (zarówno początkową, jak i podczas pisania) oraz akcję na zdarzeniu wejścia onChange
.
W value
ustawiamy ją na wartość naszego atrybutu; attributes.exampleText
. W onChange
przypadku, gdy uruchamiamy funkcję, przekazując wpisaną wartość naszego wejścia jako parametr newtext
(wartość wejściowa to właściwość zwracana z komponentu). W tej funkcji wywołujemy setAttributes()
i aktualizujemy atrybut exampleText
do tego, co zostało wpisane w danych wejściowych.
To jest podstawowy React – poza tym, że pracujemy z atrybutami, a nie stanem. Jeśli powyższe zdezorientowało Cię, polecam zajrzeć do krótkiego samouczka w React, ponieważ prawdopodobnie wyjaśnią to lepiej niż ja!
Odśwież swój edytor i zobacz, jak działa blok! Powinieneś otrzymać standardowe wejście tekstowe do wpisywania rzeczy, które zostanie zapisane za każdym razem, gdy naciśniesz Zapisz / Aktualizuj w edycji postu.
Wynik w interfejsie i w bazie danych
Jeśli przeglądasz swój post w interfejsie, powinien on nadal wyświetlać div z „:)”, ponieważ nadal mamy to w naszej save
funkcji. Ale coś się wydarzyło za kulisami! Blok komentarza naszego bloku zawiera teraz wartość naszego atrybutu w JSON.
Nie możesz zobaczyć bloków komentarzy w szablonie, który wykonuje normalne the_content()
wywołanie. Aby zobaczyć bloki komentarzy, masz dwie opcje. Spójrz na post_content
tabelę w bazie danych postów. Lub dodaj echo get_the_content()
szablon i spójrz na niego w narzędziu do sprawdzania/debugowania.
Oczywiście mamy również dostęp do atrybutów save
z rekwizytów.
Wyświetlanie wartości wejścia wsave
Wyświetlmy wartość atrybutu w div w naszej save
funkcji:
Uwaga: po dokonaniu tej zmiany otrzymasz uszkodzony blok w poście, do którego już dodałeś ten blok. Dzieje się tak, ponieważ edytor napotyka inny wynik save
niż to, co zdefiniowaliśmy teraz. Usuń blok i dodaj go ponownie. Wpisz coś w swoim tekście, zaktualizuj post i wyświetl go w interfejsie.
I to jest właściwie sedno tego. Ty decydujesz, jakich atrybutów potrzebujesz, aby zapisać to, co chcesz w swoim bloku. W edit
ten sposób wyrenderujesz sposoby wprowadzania danych przez użytkownika, dbając o to, aby bieżące wartości były wyświetlane i aktualizować je za każdym razem, gdy ulegną zmianie. Wyodrębniaj save
zapisane atrybuty i renderuj dane wyjściowe tak, jak chcesz.
W tej serii samouczków dotkniemy o wiele więcej różnych komponentów i atrybutów. Przyjrzyjmy się jednak jeszcze jednemu komponentowi w tym poście, aby zobaczyć, o co chodzi we właściwości atrybutu source
.
RichText i atrybut atrybutsource
Komponent WordPress RichText
zapewnia obszar tekstowy „bez obramowania” z obsługą formatowania tekstu. Możesz preferować używanie tego zamiast (brzydkiego?) standardowego wprowadzania tekstu lub obszaru tekstowego. Pamiętaj jednak, że RichText
musi to być obsługiwane nieco inaczej, ponieważ istnieje kilka właściwości, o których musisz wiedzieć, a także jest różnica w sposobie, w jaki utrzymujemy wartość w naszej save
funkcji.
Dodawanie RichText
komponentu
Najprostszą formą RichText
jest zaimplementowanie go tak, jak przy wprowadzaniu tekstu:
Zdestrukturyzowaliśmy RichText
komponent z wp.blockEditor
pakietu, ale poza tym powyższe jest identyczne z tym, co zrobiliśmy ze standardowym tekstem wejściowym.
Obsługa save
zRichText
Jednak w save
funkcji musisz ponownie użyć RichText
komponentu, aby uzyskać wartość atrybutu. Wywołujemy RichText.Content
i ustawiamy prop value
na nasz atrybut:
Spowoduje to wyświetlenie wszystkiego, co zostało wpisane w RichText
edytorze bezpośrednio, bez zawiniętego kodu HTML.
Podczas pracy z RichText
tobą najprawdopodobniej chcesz kontrolować opakowanie HTML wokół tekstu, na przykład a <p>
lub a <h2>
, zarówno w interfejsie, jak iw edytorze. W tym celu możemy użyć prop o nazwie tagName
.
Komponent RichText
umożliwia również kilka innych rekwizytów. placeholder
Za pomocą rekwizytu możesz zdefiniować tekst zastępczy, który będzie wyświetlany (wygaszony), gdy jest pusty. Komponent pozwala również kontrolować, jakie opcje formatowania umożliwia pole (które przyciski wyświetla na pasku narzędzi).
RichText
ztagName
Za pomocą właściwości tagName
możesz wstępnie zdefiniować, w którym tagu HTML zostanie opakowane wyjście. Kiedy używasz tagName
właściwości, powinieneś użyć tej samej właściwości tagName
i wartości w obu edit
i save
.
Powiedzmy, że chcesz umieścić wartość atrybutu w <h2>
, co spowoduje w edytorze, że każde dane wejściowe będą h2. W edit
możesz zrobić:
A w save
:
Powyższe spowoduje teraz wyświetlenie tego, co zostało wpisane w RichText
obszarze wewnątrz <h2>
tagu.
Za pomocąsource
Oczywiście możesz połączyć wiele tekstu sformatowanego w bloku, na przykład jeden dla nagłówka i jeden dla akapitu. Pamiętaj tylko, że każdy będzie potrzebował własnego atrybutu. Na przykład:
Jednak teraz zaczniesz napotykać pewne problemy. Mimo że możesz formatować tekst w edytorze, nic (lub niektóre) z formatowania nie zostaną zapisane. Kiedy przeglądasz post w interfejsie, po prostu pojawi się on jako h2
i p
, bez żadnego formatowania (kursywa, pogrubienie, link). Nawet blok komentarza do twojego bloku nie zawiera formatowania. To jest trudne z RichText
. Aby rozwiązać ten problem, musimy pracować z właściwością atrybutu source
.
Właściwość source
umożliwiająca WordPressowi wyodrębnianie i interpretowanie treści bezpośrednio z treści posta. Jeśli atrybut nie jest source
ustawiony, zostanie zapisany i wyodrębniony z bloku komentarzy HTML.
Podczas pracy RichText
zwykle ustawiamy source
na html
, który wykorzystuje bibliotekę WordPressa do analizowania znaczników HTML. Właściwość source
współpracuje z inną właściwością atrybutu; selector
który definiuje, z którego znacznika HTML powinien on wyodrębnić.
Jako przykład ustawiamy source
jak html
w naszym akapicie RichText
i ustawiamy selector
jako p
(w przeciwnym razie domyślnie jest to root of block the block).
attributes: {
...
myRichText: {
type: 'string',
source: 'html',
selector: 'p'
}
},
Teraz nasz drugi RichText
powinien pomyślnie zapisać całe formatowanie tekstu. Zauważysz również, że blok komentarza wyświetla teraz tylko myRichHeading
atrybut w JSON. Atrybut myRichText
całkowicie zniknął z bloku komentarzy. Dzieje się tak, ponieważ source
WordPress analizuje teraz treść posta zamiast bloku komentarza dla wartości atrybutu.
Aby być całkowicie szczerym, nie pracowałem tak dużo z tym source
atrybutem i zalecałbym unikanie go, jeśli możesz. Dokumentacja WordPressa wyjaśnia nieco więcej o źródle i atrybutach, które chcesz sprawdzić sam.
W tym poście poznaliśmy podstawy atrybutów; jak je zdefiniować, zaktualizować i wyprowadzić ich wartości. W kolejnych krokach przyjrzymy się większej liczbie różnych komponentów i sposobom dodawania ustawień poza samą zawartością bloku; na pasku narzędzi i pasku bocznym edytora (nazywanym Inspektorem).