React Inhalt wird zu häufig geladen

Zeppi

Aktives Mitglied
Moin, ich bin gerade dabei eine Internetseite mit der Open Weather Api zuschreiben. Dabei wird mir der Ort, Temperatur und Berschreibung angezeigt. Aber beim Laden werden die Inhalte immer häufiger als 1 Mal gerendert. Dazu habe ich im Internet auch etwas gefunden, und zwar React.memo, das hat aber nicht funktioniert. Ein weiteres Problem ist, dass die Inhalte bei den ersten Anfragen immer 'undefined' sind und nur bei der letzten Anfrage kommt dann das gewollte Ergebnis (Sehe ich nur, wenn ich mir mal den Inhalt mit Console.log() ausgeben lasse). Aber dadurch, dass es nur beim letzten Aufruf klappt, kann ich den Namen des divs nicht ändern, weil jedes Mal sagt er mir, dass er den IndexOf nicht lesen kann. <div className={description.indexOf('rain') > 0 ? 'rainy' : description.indexOf('cloud') > 0 ? 'cloudy' : 'clear')}>
Vielleicht hat jemand ja eine Idee, damit es nicht immer re-rendered wird.

[CODE lang="javascript" title="Wetter"]const Wetter = () => {
const [temp, setTemp] = useState();
const [city, setCity] = useState();
const [desc, setDesc] = useState();

window.onload = function () {
weatherBallon();
}
const weatherBallon = () => {
fetch('https://api.openweathermap.org/data/2.5/weather?q=Hamburg&appid=')
.then(resp => resp.json())
.then(data => drawWeather(data))
.catch(function (error) {
console.log(error)
});
}

function drawWeather(d) {
setTemp(Math.round(parseFloat(d.main.temp)-273.15))
setCity(d.name)
var description = d.weather[0].description
setDesc(description)
}




return (
<div>
<Anzeige temp={temp} city={city} desc={desc}></Anzeige>
</div>

)
};

export default Wetter;[/CODE]
[CODE lang="javascript" title="Anzeige"]const Anzeige = React.memo(props => {
var description = props.desc;
return (
<div>
<div className={description.indexOf('rain') > 0 ? 'rainy' : description.indexOf('cloud') > 0 ? 'cloudy' : 'clear')}>
<h1>{props.temp}</h1>
<h2>{props.city}</h2>
</div>
)
});
export default Anzeige;[/CODE]
 

mrBrown

Super-Moderator
Mitarbeiter
Erstmal: window.onload in react-code sieht sehr merkwürdig aus, das gehört da eher nicht hin. Um die Daten initial zu laden, solltest du eher useEffect nutzen.



Das, ins Blaue geraten, viermalige rendern von Anzeige liegt an der Funktionsweise von useState, in asynchronem Code führt jedes set* zu einem neuem Rendern.
In deinem Fall also:
1. Rendern beim initialen Anzeigen, das Triggert dann das fetchen der Daten, und führt zu:
2. Rendern, wenn setTemp aufgerufen wird
3. Rendern, wenn setCity aufgerufen wird
4. Rendern, wenn setDesc aufgerufen wird

React.memo hilft dabei nicht, da dies nur dafür sorgt, das die Komponente auch wirklich nur dann neu gerendert wird, wenn sich dir Pros ändern. In deine Fall ändern sie sich ja, deshalb wird da jedes Mal neu gerendert.

Lösen kannst du das, in dem du nicht drei States, sondern einen einzelnen nutzt. Grob etwa:
Javascript:
setWetherData({
  temp: ..., 
  city: ...,
  desc: ...,
});

Damit hast du nur einen State, der sich ändern, und der alle zusammengehörenden Daten enthält.
 

Zeppi

Aktives Mitglied
Erstmal: window.onload in react-code sieht sehr merkwürdig aus, das gehört da eher nicht hin. Um die Daten initial zu laden, solltest du eher useEffect nutzen.



Das, ins Blaue geraten, viermalige rendern von Anzeige liegt an der Funktionsweise von useState, in asynchronem Code führt jedes set* zu einem neuem Rendern.
In deinem Fall also:
1. Rendern beim initialen Anzeigen, das Triggert dann das fetchen der Daten, und führt zu:
2. Rendern, wenn setTemp aufgerufen wird
3. Rendern, wenn setCity aufgerufen wird
4. Rendern, wenn setDesc aufgerufen wird

React.memo hilft dabei nicht, da dies nur dafür sorgt, das die Komponente auch wirklich nur dann neu gerendert wird, wenn sich dir Pros ändern. In deine Fall ändern sie sich ja, deshalb wird da jedes Mal neu gerendert.

Lösen kannst du das, in dem du nicht drei States, sondern einen einzelnen nutzt. Grob etwa:
Javascript:
setWetherData({
  temp: ...,
  city: ...,
  desc: ...,
});

Damit hast du nur einen State, der sich ändern, und der alle zusammengehörenden Daten enthält.
Danke, das hat mir geholfen. Habe es leider erst jetzt gesehen. UseEffect kannte ich noch nicht, das werde ich mir gleich mal angucken.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Wie kann das Problem mit der „CORS-Richtlinie“ gelöst werden, wenn Anfragen vom React-Front-End an das Node.js-Back-End gesendet werden? Angular, React, JQuery - Fragen zu JavaScript 1
8u3631984 React : 64 Byte Array in Image umwandeln Angular, React, JQuery - Fragen zu JavaScript 4
9 React Componet richtig auslagern Angular, React, JQuery - Fragen zu JavaScript 0
D Angular/React/Vue Angular, React, JQuery - Fragen zu JavaScript 1
N werde zu einer leeren Seite weitergeleitet wenn ich über react-router-dom zur neuen klasse leiten will Angular, React, JQuery - Fragen zu JavaScript 1
B React Page öffnen Angular, React, JQuery - Fragen zu JavaScript 0
WinterLLL React-App Fehlermeldung Angular, React, JQuery - Fragen zu JavaScript 2
L Inhalt von Input in Variable speichern, zurücksetzen mit Java Angular, React, JQuery - Fragen zu JavaScript 1
Q Named outlet zeigt keinen Inhalt Angular, React, JQuery - Fragen zu JavaScript 0
C Inhalt als Datei auf Server speichern Angular, React, JQuery - Fragen zu JavaScript 8
Inhalt Kopieren & woanders eintragen Angular, React, JQuery - Fragen zu JavaScript 1
inhalt Kopieren und woanders einfügen ? Angular, React, JQuery - Fragen zu JavaScript 2
P div container Inhalt aktualiseren Angular, React, JQuery - Fragen zu JavaScript 3
dizzydwar Iframe -inhalt dynamisch skalieren Angular, React, JQuery - Fragen zu JavaScript 4
D Passwort prüfen auf Inhalt Angular, React, JQuery - Fragen zu JavaScript 7
D Fenster Grösse dem Inhalt anpassen Angular, React, JQuery - Fragen zu JavaScript 5
SKB jQuery Autocomplete - Title Attribute wird nur bei Mousehover gezeigt - nicht bei Pfeil Navi Angular, React, JQuery - Fragen zu JavaScript 0
E Javascript wenn Variable aktualisiert wird, dann prüfe Angular, React, JQuery - Fragen zu JavaScript 0
boxi Jquery bei Ajax Call wird response ignoriert. Angular, React, JQuery - Fragen zu JavaScript 2
Kenan89 JS OO Funktion wird falsch aufgerufen Angular, React, JQuery - Fragen zu JavaScript 2
C Ein Programm Wort Affe das an 10 verschieden positionen gezeichnet wird Angular, React, JQuery - Fragen zu JavaScript 5
F Javascript wird nicht ausgeführt Angular, React, JQuery - Fragen zu JavaScript 3
G Mein Dropdownmenü wird nur vom IE geblockt Angular, React, JQuery - Fragen zu JavaScript 5
P Formular wird abgeschickt - php-datei öffnet sich nicht Angular, React, JQuery - Fragen zu JavaScript 3
C JS funktion funktioniert nicht / wird nicht aufgerufen. Angular, React, JQuery - Fragen zu JavaScript 2
G Frame wird nicht angezeigt Angular, React, JQuery - Fragen zu JavaScript 2

Ähnliche Java Themen


Oben