Esta página se tradujo automáticamente y puede contener errores. Leer el original en inglés

API

WebView

nsh exporta WebView: una página web mostrada por el motor de navegador propio de la plataforma (WKWebView en iOS y Mac Catalyst, android.webkit.WebView en Android). Es una vista nativa con el layout como cualquier otra, por lo que se desplaza, recorta y se superpone correctamente a otras vistas.

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

Consulta Web view y vídeo para la guía y <WebView> para sus 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 acepta las props de vista (style, classes, layout, accesibilidad, ref; sin hijos), además de:

Prop Tipo Predeterminado Descripción
src string La URL de la página que se muestra.
html string HTML en línea, que se muestra en lugar de src.
baseUrl string Base contra la que se resuelven los enlaces relativos de html.
injectedJavaScript string Se ejecuta después de cargar cada página.
injectedJavaScriptBeforeContentLoaded string Se ejecuta antes de los scripts propios de cada página.
userAgent string el de la plataforma La cadena de user agent.
scrollable boolean true El usuario puede desplazar la página.
javaScriptEnabled boolean true Las páginas ejecutan scripts.
ios { allowsBackForwardNavigationGestures?: boolean } Solo iOS: deslizar desde los bordes para retroceder y avanzar.
desktop { allowsBackForwardNavigationGestures?: boolean } macOS: los deslizamientos con dos dedos en el trackpad retroceden y avanzan; Windows: deslizamientos en pantalla táctil; Linux: deslizamientos en el touchpad.

#Eventos

Evento Payload Cuándo
onLoadStart WebViewNavigation Una página empieza a cargarse.
onLoad WebViewNavigation Una página terminó de cargarse.
onError { message: string } Una página no pudo cargarse.
onNavigationStateChange WebViewNavigation Cambió la URL, el título, el estado de carga o el historial.
onMessage { data: string } La página llamó a window.nsh.postMessage(data).
interface WebViewNavigation {
  url: string;
  title: string;
  loading: boolean;
  canGoBack: boolean;
  canGoForward: boolean;
}

#Métodos del ref

Método Descripción
reload() Recarga la página.
goBack() Retrocede en su historial.
goForward() Avanza en su historial.
stopLoading() Detiene la carga.
injectJavaScript(script) Ejecuta script en la página.
postMessage(data) Envía data (una cadena) a la página: un evento message en window, con data como event.data.

#Comunicación con la página

La página envía cadenas a la app con window.nsh.postMessage(…); la app envía cadenas a la página con ref.postMessage(…). Envía JSON para datos estructurados.

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>

#Capacidades

Cuando tu app declara capabilities en nsh.json, un web view solo puede mostrar y navegar a los hosts listados en webview; las demás navegaciones de nivel superior se rechazan de forma nativa. Una app sin la clave capabilities puede mostrar cualquier cosa. Consulta Sandbox y capacidades.

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