【发布时间】:2020-07-09 13:41:02
【问题描述】:
如果只有部分状态发生变化,有没有办法停止响应重新渲染?
问题在于,每次我将鼠标悬停在标记上时,都会打开或关闭一个弹出窗口,这会导致所有标记重新呈现,即使 mystate 没有改变,只是 activePlace 状态正在改变。 console.log(myState); 每次我在标记内外悬停时都会运行。
我尝试使用 useMemo 钩子,但不知道如何使用它。有什么帮助吗?
这是我的代码:
import React, { useEffect, useState } from 'react';
import { Map, TileLayer, Marker, Popup } from 'react-leaflet';
import axios from 'axios';
import { v4 as uuidv4 } from 'uuid';
import { Icon } from 'leaflet';
const myicon = new Icon({
iconUrl: './icon.svg',
iconSize: [20, 20]
});
const MyMap = () => {
const [myState, setMyState] = useState(null);
const [activePlace, setActivePlace] = useState(null);
const getData = async () => {
let response = await axios
.get('https://corona.lmao.ninja/v2/jhucsse')
.catch(err => console.log(err));
let data = response.data;
setMyState(data);
// console.log(data);
};
useEffect(() => {
getData();
}, []);
if (myState) {
console.log(myState);
return (
<Map
style={{ height: '100vh', width: '100vw' }}
center={[14.561, 17.102]}
zoom={1}
>
<TileLayer
attribution='© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors © <a href="https://carto.com/attributions">CARTO</a>'
url={
'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png'
}
/>
{myState.map(country => {
return (
<Marker
key={uuidv4()}
position={[
country.coordinates.latitude,
country.coordinates.longitude
]}
onmouseover={() => {
setActivePlace(country);
}}
onmouseout={() => {
setActivePlace(null);
}}
icon={myicon}
/>
);
})}
{activePlace && (
<Popup
position={[
activePlace.coordinates.latitude,
activePlace.coordinates.longitude
]}
>
<div>
<h4>Country: {activePlace.country}</h4>
</div>
</Popup>
)}
</Map>
);
} else {
return <div>Loading</div>;
}
};
export default MyMap;
【问题讨论】:
-
您是否已经尝试过使用 Pure Component 或者您需要使用无状态组件来保留 react hooks?
-
@VictorAlessander 我没有尝试过纯组件。我不明白你说的下一部分。
-
无状态组件也称为函数组件(reactjs.org/docs/…)
-
@VictorAlessander 有没有办法修复它,同时保持它是一个功能组件,我不想使用基于类的组件
-
仅仅因为这个函数在状态改变时重新运行,并不意味着 UI 正在重新渲染。这是否会导致您的应用程序出现问题,或者您只是担心因为您认为它可能会这样做?
标签: javascript reactjs react-hooks react-component react-state-management