Yönlendirme ve Gezinme
Carats'ta yönlendirme bir dosya sistemi değil, veridir. Her rota, istemci ile sunucunun paylaştığı tek bir facet nesnesinde bildirilir.
Rotalar
Rotalar haritası bir rota kalıbından sayfa bileşenine gider. Kalıp, iki nokta ile başlayan segmentler dışında birebir eşleştirilir; bu segmentler bir parametre yakalar.
import { defineFacets } from '@carats/render';
import ErrorPage from './pages/_error';
import NotFound from './pages/_not_found';
import Home from './pages/home';
import Market from './pages/market';
import Profile from './pages/profile';
import Trade from './pages/trade';
export default defineFacets({
routes: {
'/': Home,
'/profile': Profile,
'/market': Market,
'/trade/:symbol': Trade
},
suspense: {
error: ErrorPage,
notFound: NotFound
},
inAppRouting: true
});
Sayfa klasörü adı bir gelenek, bir gereklilik değildir. Klasör ilgili dosyaları bir arada tutar; ancak bir klasörün sunduğu rota, onun eşlendiği dizedir; bu yüzden `/market`, adı daha iyi okunuyorsa `browse` adlı bir klasörde yaşayabilir.
Dinamik Parametreler
Bir :name segmenti, sayfa bileşeninde bir prop olur ve aynı rota için bir culet'in içinde params.name olarak da kullanılabilir. İki tarafta ad eşleşmelidir.
import { Burnish } from '@carats/render';
import Layout from '../_layout';
import './trade.sass';
export default Burnish<TradeData>(function (data) {
this.head = <title>Trade {data.symbol}</title>;
return (
<Layout>
<h1>{data.symbol}</h1>
</Layout>
);
});
`/trade/btc`, bu sayfayı aynı rota için kayıtlı culet'ten çözülen `data.symbol` ile işler ve sayfa her sembol için farklı bir `
` üretir. Eşleştirmeyi framework, bileşeni, çıkarılan `params` ve eşleşen `route` ile döndüren `getPageComponent` yapar.</p><blockquote><p>Rota kalıpları @carats/url tarafından matchRoute ile eşleştirilir. Joker karakter, isteğe bağlı segment veya her şeyi yakalayan desen yoktur: eşleşmeyen bir URL yerine notFound suspense bileşenini işler.</p></blockquote><h2>Uygulama İçi Yönlendirme</h2><p>inAppRouting açıkken istemci, iç bağlantılara tıklamayı yakalar ve tam sayfa yüklemesi olmadan sayfayı değiştirir. Bu, istemci giriş noktasında clientRender() gerektirir. Bir sayfa tam belge yüklemesine bağlıysa, örneğin her gezinmede üçüncü taraf bir betik çalıştırması gereken bir sayfa, kapatın.</p><pre><code class="hljs language-typescript"><span class="hljs-comment">// src/client/entrypoint.ts</span><span class="hljs-keyword">import</span> { mount, clientRender } <span class="hljs-keyword">from</span> <span class="hljs-string">'@carats/csr'</span>;<span class="hljs-keyword">import</span> facets <span class="hljs-keyword">from</span> <span class="hljs-string">'./facets.cara'</span>;<span class="hljs-title function_">mount</span>(facets);<span class="hljs-title function_">clientRender</span>();</code></pre><p>Uygulama içi yönlendirme açıkken iki satır da gereklidir. `mount` facet'leri tarayıcıya kaydeder, `clientRender` gezinmeyi yakalamaya başlar.</p><p>Bağlantılar framework bileşenine ihtiyaç duymaz. Düz bir çapa otomatik olarak yakalanır ve yakalama devre dışı bırakılırsa normal bir bağlantı normal şekilde izlenir; bu da sayfaların taranabilir kalmasını ve JavaScript olmadan çalışmasını sağlar.</p><h2>Programatik Gezinme</h2><p>@carats/csr'dan gelen goTo, yakalanan bir bağlantı tıklamasıyla aynı şekilde gezinir. Bir arama kutusunu ya da belgenin yeniden yüklenmemesi gereken başka bir formu göndermek için doğru yoldur.</p><pre><code class="hljs language-tsx"><span class="hljs-keyword">import</span> { goTo } <span class="hljs-keyword">from</span> <span class="hljs-string">'@carats/csr'</span>;<span class="hljs-keyword">import</span> { afterMount } <span class="hljs-keyword">from</span> <span class="hljs-string">'@carats/hooks'</span>;<span class="hljs-keyword">import</span> <span class="hljs-string">'./search-bar.sass'</span>;<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">SearchInput</span>(<span class="hljs-params"></span>) { <span class="hljs-title function_">afterMount</span>(<span class="hljs-function">() =></span> { <span class="hljs-keyword">const</span> form=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">'search-bar'</span>); <span class="hljs-keyword">const</span> <span class="hljs-title function_">submit</span>=(<span class="hljs-params"><span class="hljs-attr">e</span>: <span class="hljs-title class_">Event</span></span>) => { e.<span class="hljs-title function_">preventDefault</span>(); <span class="hljs-keyword">const</span> input=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">'search-input'</span>) <span class="hljs-keyword">as</span> <span class="hljs-title class_">HTMLInputElement</span>; <span class="hljs-title function_">goTo</span>(<span class="hljs-string">`/search?q=<span class="hljs-subst">${input.value}</span>`</span>); }; form?.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'submit'</span>, submit); <span class="hljs-keyword">return</span> <span class="hljs-function">() =></span> form?.<span class="hljs-title function_">removeEventListener</span>(<span class="hljs-string">'submit'</span>, submit); }); <span class="hljs-keyword">return</span> ( <span class="language-xml"><span class="hljs-tag"><<span class="hljs-name">form</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"search-bar"</span>></span> <span class="hljs-tag"><<span class="hljs-name">input</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"search-input"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"q"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> /></span> <span class="hljs-tag"></<span class="hljs-name">form</span>></span></span> );}</code></pre><p>Sorgu dizesini standart `URLSearchParams` ile kurun; kodlama sizin için ele alınır. Bir bileşenden geçerli rotanın parametrelerini okumak için bir culet'e sorun: culet eşleşen parametreleri `req.params` içinde alır, sayfa ise culet'in döndürdüğü şeyi alır.</p><h2>Suspense Durumları</h2><p>Suspense haritası, bir rota sayfa üretemediğinde kullanılacak bileşenleri sağlar: eşleşmeyen bir URL için notFound, bir bileşenin veya culet'in fırlattığı hata için error. İkisi de isteğe bağlıdır ve error, fırlatılan Error'ı tek argüman olarak alır.</p><pre><code class="hljs language-tsx"><span class="hljs-comment">// src/client/pages/_not_found/index.tsx</span><span class="hljs-keyword">import</span> <span class="hljs-title class_">Layout</span> <span class="hljs-keyword">from</span> <span class="hljs-string">'../_layout'</span>;<span class="hljs-keyword">import</span> <span class="hljs-string">'./notfound.sass'</span>;<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">NotFound</span>(<span class="hljs-params"></span>) { <span class="hljs-keyword">return</span> ( <span class="language-xml"><span class="hljs-tag"><<span class="hljs-name">Layout</span>></span> <span class="hljs-tag"><<span class="hljs-name">section</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"notfound-page container"</span>></span> <span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"notfound-code"</span>></span>404<span class="hljs-tag"></<span class="hljs-name">div</span>></span> <span class="hljs-tag"><<span class="hljs-name">h1</span>></span>Page not found<span class="hljs-tag"></<span class="hljs-name">h1</span>></span> <span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"btn btn-primary"</span>></span>Return to Dashboard<span class="hljs-tag"></<span class="hljs-name">a</span>></span> <span class="hljs-tag"></<span class="hljs-name">section</span>></span> <span class="hljs-tag"></<span class="hljs-name">Layout</span>></span></span> );}</code></pre><pre><code class="hljs language-tsx"><span class="hljs-comment">// src/client/pages/_error/index.tsx</span><span class="hljs-keyword">import</span> <span class="hljs-title class_">Layout</span> <span class="hljs-keyword">from</span> <span class="hljs-string">'../_layout'</span>;<span class="hljs-keyword">import</span> <span class="hljs-string">'./error.sass'</span>;<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">ErrorPage</span>(<span class="hljs-params"><span class="hljs-attr">error</span>: <span class="hljs-title class_">Error</span></span>) { <span class="hljs-keyword">return</span> ( <span class="language-xml"><span class="hljs-tag"><<span class="hljs-name">Layout</span>></span> <span class="hljs-tag"><<span class="hljs-name">section</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"error-page container"</span>></span> <span class="hljs-tag"><<span class="hljs-name">h1</span>></span>Something went wrong<span class="hljs-tag"></<span class="hljs-name">h1</span>></span> <span class="hljs-tag"><<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"error-message"</span>></span>{error.message}<span class="hljs-tag"></<span class="hljs-name">p</span>></span> <span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"btn btn-primary"</span>></span>Return to Dashboard<span class="hljs-tag"></<span class="hljs-name">a</span>></span> <span class="hljs-tag"></<span class="hljs-name">section</span>></span> <span class="hljs-tag"></<span class="hljs-name">Layout</span>></span></span> );}</code></pre><p>İkisini de paylaşılan layout'un içine sarın. Site kabuğu olmadan işlenen hatalı bir sayfayı teşhis etmek, başlığı ve gezinmeyi koruyan bir sayfaya göre çok daha zordur.</p></div> </article> </main> <footer> <span class="footer-mark">◆ carats · belgelendirme</span></footer> </div> <script src="/static/js/ui.js"></script> <script type="module" src="/static/js/search.js" defer></script> </body></html>