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
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
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
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
Zur Installation können Sie npm oder Garn verwenden:
# For NPM:
npm install react-device-detect --save
# For Yarn
yarn add react-device-detect
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>
);
}
});
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
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
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 />
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