ReactJS: So bestimmen Sie, ob die Anwendung im mobilen oder Desktop-Browser angezeigt wird

Lesezeit: 6 Minuten

Gibt es in ReactJS eine Möglichkeit festzustellen, ob die Website auf dem Handy oder dem Desktop angezeigt wird? Denn je nach Gerät möchte ich unterschiedliche Sachen rendern.

Vielen Dank

  • Ich bin nicht cool mit vielen Antworten, die nur von der Bildschirmbreite abhängen. Wenn Sie zum Beispiel in den Querformatmodus wechseln, möchte ich immer noch zwischen einer Telefon- und einer Desktop-Version unterscheiden, insbesondere bei den Steuerungsmöglichkeiten. Ein sauberes Setup sollte in der Lage sein zu unterscheiden zwischen: Mobil/Tablet/Desktop-Hochformat/Querformat-Touch/No-Touch-Tasten/Nokeys am wenigsten, aber nicht zuletzt pixelbasierten Haltepunkten

    – mapadj

    3. November 2021 um 11:52 Uhr


Benutzer-Avatar
Volobot Fortgeschrittene Systeme

Einfache Lösung mit Reaktionshaken

const [width, setWidth] = useState<number>(window.innerWidth);

function handleWindowSizeChange() {
    setWidth(window.innerWidth);
}
useEffect(() => {
    window.addEventListener('resize', handleWindowSizeChange);
    return () => {
        window.removeEventListener('resize', handleWindowSizeChange);
    }
}, []);

const isMobile = width <= 768;

  • Einfach und nicht paketabhängig, diese sollte höher sein

    – Sebastian Cristi Castillo

    3. November 2020 um 20:34 Uhr

  • Wartet dies auf das Laden der Seite, da die Kombination window/useEffect verwendet wird? In diesem Fall denke ich, dass es zu einer sichtbaren Layoutverschiebung kommen wird. Funktionieren die unten aufgeführten Bibliotheken anders? Ich habe ein Problem mit der Layoutverschiebung bei der Erkennung der Fenstergröße in React

    – m4tt

    3. März 2021 um 20:11 Uhr

  • Es wäre besser, wenn der Zustand ein boolesches “isMobile” oder ähnliches speichert. Mit dieser aktuellen Lösung würde es bei jeder Größenänderung neu rendern, wo Sie wahrscheinlich nur neu rendern möchten, wenn es zwischen mobiler und Desktop-Ansicht wechselt.

    – Maurice Nino

    6. Februar um 12:04 Uhr

  • Ich denke nicht, dass die Verwendung von innerWidth am besten ist. Was ist mit Android-Geräten, die eine sehr große Innenbreite haben?

    – Tammibriggs

    19. März um 16:35 Uhr

Benutzer-Avatar
Raz Luvaton

Sie können verwenden Reagieren Sie auf das Geräteerkennungspaket

Dieses Paket verwendet die user-agent des Browsers und nicht der Bildschirmgröße.

Dies kann hilfreich sein, wenn Sie unterschiedliche Dinge anzeigen möchten, ob auf dem Desktop oder auf dem Handy, oder bestimmte Links basierend auf dem Gerät

Installation

Zur Installation können Sie npm oder Garn verwenden:

# For NPM:
npm install react-device-detect --save

# For Yarn
yarn add react-device-detect

Verwendungszweck

Beispiel:

import {BrowserView, MobileView} from 'react-device-detect';

const MyComponent = () => {
    return (
        <>
            <BrowserView>
                <h1>This is rendered only in browser</h1>
            </BrowserView>
            <MobileView>
                <h1>This is rendered only on mobile</h1>
            </MobileView>
        </>
    );
};

Wenn Sie keine Ansicht benötigen, können Sie verwenden isMobile für bedingtes Rendern

import {isMobile} from 'react-device-detect';

const MyComponent = () => {
    if(isMobile) {
        return (
            <div> This content is available only on mobile</div>
        )
    }
    return (
        <div> content... </div>
    );
};

Genommen von React Device Detect README mit einer kleinen Modifikation

  • Das React Device Detect Package funktioniert einwandfrei, das einzige Problem ist, dass es nicht erkennt, wenn der Benutzer die Größe der Seite ändert.

    – Dhia Djobbi

    8. August 2021 um 23:12 Uhr

  • Wenn wir window.innerWidth und window.innerHeight haben, warum sollten wir dieses Paket verwenden? Was ist der Vorteil?

    – Marzieh Mussawi

    30. Januar um 9:08 Uhr

  • Da dies eher auf dem Benutzeragenten als auf der Fenstergröße basiert, habe ich es verwendet, um die relevante Link-App anzuzeigen, falls sie auf dem Desktop angezeigt wird oder iOS Android ist

    – Raz Luvaton

    30. Januar um 9:44 Uhr

  • Ich habe meine Antwort aktualisiert, um diesen Unterschied zu verdeutlichen

    – Raz Luvaton

    30. Januar um 9:44 Uhr

Ich habe Volobots Antwort weiter verbessert. Ich hatte einen Haken wie unten erstellt und er funktioniert wie ein Zauber 🙂

import React, {useEffect, useState} from "react";

const useCheckMobileScreen = () => {
    const [width, setWidth] = useState(window.innerWidth);
    const handleWindowSizeChange = () => {
            setWidth(window.innerWidth);
    }

    useEffect(() => {
        window.addEventListener('resize', handleWindowSizeChange);
        return () => {
            window.removeEventListener('resize', handleWindowSizeChange);
        }
    }, []);

    return (width <= 768);
}

export default useCheckMobileScreen

Was Sie suchen, heißt react-responsive. Du kannst es finden hier

Hier ist how to use Kurzanleitung aus ihrem Repo:

var MediaQuery = require('react-responsive');

var A = React.createClass({
  render: function(){
    return (
      <div>
        <div>Device Test!</div>

        <MediaQuery minDeviceWidth={1224}>
          <div>You are a desktop or laptop</div>
        </MediaQuery>
        <MediaQuery maxDeviceWidth={1224}>
          <div>You are a tablet or mobile phone</div>
        </MediaQuery>

        <MediaQuery orientation='portrait'>
          <div>You are portrait</div>
        </MediaQuery>
        <MediaQuery orientation='landscape'>
          <div>You are landscape</div>
        </MediaQuery>

        <MediaQuery minResolution='2dppx'>
          <div>You are retina</div>
        </MediaQuery>
      </div>
    );
  }
});

Benutzer-Avatar
chirayu joshi

Warum die Dinge komplizieren, wenn Sie eine Zeile Vanilla-Javascript-Code verwenden können?

Verwenden window.screen Objekt, um die Breite des aktuellen Bildschirms zu erhalten. Zum Beispiel window.screen.width gibt den Wert der aktuellen Breite des Clients in Pixel zurück.

Verwenden Sie es drinnen if (window.screen.width >= 1280) { /* conditional statements */ }

Ich hoffe, dass es hilft. Vielen Dank 🙂

  • Ich denke, wenn Sie an verschiedenen Stellen prüfen, ob es sich um die mobile Größe handelt oder nicht, spricht einiges dafür, es in einen Hook zu abstrahieren, damit Sie keine Redundanz in Ihrem Code haben. Wenn Sie jedoch sicher sind, dass die Überprüfung einmalig ist, erscheint dieser Ansatz vernünftig.

    – jnotelddim

    10. Februar 2021 um 19:07 Uhr

Benutzer-Avatar
Jayasuryan

Erstellen Sie einen benutzerdefinierten Hook und hören Sie auf Größenänderung, Laden, Ausrichtungsänderung und Neuladen wird die Komponente neu rendern, in der Sie diesen Hook verwendet haben.

  import { useState, useEffect } from 'react';

  const useDeviceDetect = () => {
    const checkForDevice = () => {
      let windowWidth = window.innerWidth;
      if (windowWidth < 767.98) {
        return true;
      } else {
        return false;
      }
    };

    const [isMobile, setIsMobile] = useState(checkForDevice());

    useEffect(() => {
      const handlePageResized = () => {
        setIsMobile(checkForDevice);
      };

      window.addEventListener('resize', handlePageResized);
      window.addEventListener('orientationchange', handlePageResized);
      window.addEventListener('load', handlePageResized);
      window.addEventListener('reload', handlePageResized);

      return () => {
        window.removeEventListener('resize', handlePageResized);
        window.removeEventListener('orientationchange', handlePageResized);
        window.removeEventListener('load', handlePageResized);
        window.removeEventListener('reload', handlePageResized);
      };
    }, []);

    return {
      isMobile,
    };
  };

  export default useDeviceDetect;

  • Ich denke, wenn Sie an verschiedenen Stellen prüfen, ob es sich um die mobile Größe handelt oder nicht, spricht einiges dafür, es in einen Hook zu abstrahieren, damit Sie keine Redundanz in Ihrem Code haben. Wenn Sie jedoch sicher sind, dass die Überprüfung einmalig ist, erscheint dieser Ansatz vernünftig.

    – jnotelddim

    10. Februar 2021 um 19:07 Uhr

Benutzer-Avatar
ZStoneDPM

Ich habe diese Methode für React verwendet und sie funktioniert 2020 hervorragend. Danke @Anubahav Gupta

npm install react-responsive --save

Dann Komponente erstellen:

import React, { Fragment, Component } from 'react';
import MediaQuery from 'react-responsive';

class MyMediaQuery extends Component {
    render() {
        return (
            <Fragment>
                <div>Device Test!</div>

                <MediaQuery minDeviceWidth={1224}>
                    <div>You are a desktop or laptop</div>
                </MediaQuery>
                <MediaQuery maxDeviceWidth={1224}>
                    <div>You are a tablet or mobile phone</div>
                </MediaQuery>

                <MediaQuery orientation='portrait'>
                    <div>You are portrait</div>
                </MediaQuery>
                <MediaQuery orientation='landscape'>
                    <div>You are landscape</div>
                </MediaQuery>

                <MediaQuery minResolution='2dppx'>
                    <div>You are retina</div>
                </MediaQuery>
            </Fragment>
        );
    }
}

export default MyMediaQuery;

Es funktioniert unverändert auf jeder geladenen Seite, kann aber auch in eine andere Datei importiert werden mit:

import MyMediaQuery from '.newFileName';

Dann überall verwendet als:

<MyMediaQuery />

1091170cookie-checkReactJS: So bestimmen Sie, ob die Anwendung im mobilen oder Desktop-Browser angezeigt wird

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy