Эта страница переведена машинным способом и может содержать ошибки. Читать оригинал на английском

API

WebView

nsh экспортирует WebView: веб-страницу, отображаемую собственным браузерным движком платформы (WKWebView на iOS и Mac Catalyst, android.webkit.WebView на Android). Это нативное представление, которое размещается как любое другое, поэтому оно корректно прокручивается, обрезается и перекрывается другими представлениями.

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

Руководство: Веб-представление и видео. Свойства: <WebView>.

#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 принимает свойства представления (style, classes, layout, accessibility, ref; без дочерних элементов), а также:

СвойствоТипПо умолчаниюОписание
srcstringURL отображаемой страницы.
htmlstringВстроенный HTML, отображаемый вместо src.
baseUrlstringБаза, относительно которой разрешаются относительные ссылки в html.
injectedJavaScriptstringВыполняется после загрузки каждой страницы.
injectedJavaScriptBeforeContentLoadedstringВыполняется перед собственными скриптами каждой страницы.
userAgentstringзначение платформыСтрока user agent.
scrollablebooleantrueПользователь может прокручивать страницу.
javaScriptEnabledbooleantrueСтраницы выполняют скрипты.
ios{ allowsBackForwardNavigationGestures?: boolean }Только iOS: свайп от краёв экрана для перехода назад и вперёд.
desktop{ allowsBackForwardNavigationGestures?: boolean }macOS: свайп двумя пальцами на трекпаде для перехода назад и вперёд; Windows: свайпы на сенсорном экране; Linux: свайпы на тачпаде.

#События

СобытиеДанныеКогда
onLoadStartWebViewNavigationСтраница начинает загружаться.
onLoadWebViewNavigationСтраница загрузилась.
onError{ message: string }Страницу не удалось загрузить.
onNavigationStateChangeWebViewNavigationИзменились URL, заголовок, состояние загрузки или история.
onMessage{ data: string }Страница вызвала window.nsh.postMessage(data).
interface WebViewNavigation {
  url: string;
  title: string;
  loading: boolean;
  canGoBack: boolean;
  canGoForward: boolean;
}

#Методы ref

МетодОписание
reload()Перезагружает страницу.
goBack()Переходит назад по истории.
goForward()Переходит вперёд по истории.
stopLoading()Останавливает загрузку.
injectJavaScript(script)Выполняет script на странице.
postMessage(data)Отправляет data (строку) на страницу: событие message на window, где data передаётся как event.data.

#Взаимодействие со страницей

Страница отправляет строки в приложение через window.nsh.postMessage(…), а приложение отправляет строки на страницу через ref.postMessage(…). Для структурированных данных отправляйте JSON.

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 в nsh.json, веб-представление может показывать и открывать только хосты, перечисленные в webview; остальные навигации верхнего уровня отклоняются на нативном уровне. Приложение без ключа capabilities может показывать что угодно. См. Песочница и возможности.

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