Diese Seite wurde maschinell übersetzt und kann Fehler enthalten. Das englische Original lesen

API

WebView

nsh exportiert WebView: eine Webseite, die von der Browser-Engine der Plattform selbst dargestellt wird (WKWebView unter iOS und Mac Catalyst, android.webkit.WebView unter Android). Es ist eine native View, die wie jede andere View im Layout angeordnet wird, sodass sie korrekt scrollt, clippt und andere Views überlappt.

import { WebView, type WebViewNavigation, type WebViewProps } from "nsh";

Siehe Web view and video für die Anleitung und <WebView> für die zugehörigen Props.

#WebView

const WebView: (props: WebViewProps) => JSX.Element;

interface WebViewProps extends Omit<ViewProps, "children" | "ios" | "desktop">, WebViewHostProps {
  ios?: IOSWebViewHostProps;
  desktop?: DesktopWebViewHostProps;
}
import { mount, signal, Text, View, WebView, type WebViewNavigation, type WebViewRef } from "nsh";

function Browser() {
  const nav = signal<WebViewNavigation | null>(null);
  let web!: WebViewRef;
  return (
    <View style={{ flex: 1 }}>
      <View style={{ flexDirection: "row", gap: 16, padding: 12 }}>
        <Text onPress={() => web.goBack()} style={{ opacity: nav()?.canGoBack ? 1 : 0.4 }}>Back</Text>
        <Text onPress={() => web.reload()}>Reload</Text>
        <Text style={{ numberOfLines: 1, flex: 1 }}>{nav()?.title ?? ""}</Text>
      </View>
      <WebView ref={web} src="https://example.com" style={{ flex: 1 }} onNavigationStateChange={(n) => nav.set(n)} />
    </View>
  );
}

mount(Browser);

#Props

WebView akzeptiert die View-Props (Style, Klassen, Layout, Barrierefreiheit, ref; keine Children) sowie zusätzlich:

Prop Typ Standard Beschreibung
src string Die URL der anzuzeigenden Seite.
html string Inline-HTML, das anstelle von src angezeigt wird.
baseUrl string Die Basis, gegen die relative Links aus html aufgelöst werden.
injectedJavaScript string Wird nach dem Laden jeder Seite ausgeführt.
injectedJavaScriptBeforeContentLoaded string Wird vor den eigenen Skripten jeder Seite ausgeführt.
userAgent string plattformabhängig Der User-Agent-String.
scrollable boolean true Der Benutzer kann die Seite scrollen.
javaScriptEnabled boolean true Seiten führen Skripte aus.
ios { allowsBackForwardNavigationGestures?: boolean } Nur iOS: Wischen von den Rändern, um zurück- und vorwärtszunavigieren.
desktop { allowsBackForwardNavigationGestures?: boolean } macOS: Wischgesten mit zwei Fingern auf dem Trackpad navigieren zurück und vorwärts; Windows: Wischgesten auf dem Touchscreen; Linux: Wischgesten auf dem Touchpad.

#Events

Event Payload Wann
onLoadStart WebViewNavigation Eine Seite beginnt zu laden.
onLoad WebViewNavigation Eine Seite wurde fertig geladen.
onError { message: string } Eine Seite konnte nicht geladen werden.
onNavigationStateChange WebViewNavigation URL, Titel, Ladezustand oder Verlauf haben sich geändert.
onMessage { data: string } Die Seite hat window.nsh.postMessage(data) aufgerufen.
interface WebViewNavigation {
  url: string;
  title: string;
  loading: boolean;
  canGoBack: boolean;
  canGoForward: boolean;
}

#Ref-Methoden

Methode Beschreibung
reload() Lädt die Seite neu.
goBack() Geht im Verlauf zurück.
goForward() Geht im Verlauf vorwärts.
stopLoading() Bricht das Laden ab.
injectJavaScript(script) Führt script in der Seite aus.
postMessage(data) Sendet data (einen String) an die Seite: ein message-Event auf window, mit data als event.data.

#Kommunikation mit der Seite

Die Seite sendet Strings mit window.nsh.postMessage(…) an die App; die App sendet Strings mit ref.postMessage(…) an die Seite. Für strukturierte Daten sollte JSON gesendet werden.

const page = `<!doctype html><html><head><meta name="viewport" content="width=device-width"></head>
<body>
  <button onclick="window.nsh.postMessage('hello from the page')">Post to the app</button>
  <p id="got"></p>
  <script>
    window.addEventListener('message', (e) => { document.getElementById('got').textContent = e.data; });
  </script>
</body></html>`;

let web!: WebViewRef;
const message = signal("");

<WebView ref={web} html={page} style={{ height: 200 }} onMessage={(e) => message.set(e.data)} />
<Text onPress={() => web.postMessage("hi from the app")}>Post to the page</Text>

#Capabilities

Wenn Ihre App capabilities in nsh.json deklariert, darf eine Web View nur die unter webview aufgeführten Hosts anzeigen und dorthin navigieren; andere Top-Level-Navigationen werden nativ abgelehnt. Eine App ohne capabilities-Schlüssel darf beliebige Inhalte anzeigen. Siehe Sandbox and capabilities.

{
  "capabilities": {
    "webview": { "hosts": ["example.com", "*.example.com"] }
  }
}