【发布时间】:2021-07-24 10:24:26
【问题描述】:
无论我访问哪个站点以明确我对反应状态的疑问,我总是发现这个定义的共同点是: “控制组件行为的一组可观察属性的对象”。而且我仍然不明白反应中的状态。考虑下面的例子
import React,{useState} from 'react';
export const City = ()=>{
const [altitude,setAltitude] = useState("");
const getAltitude=()=>{
navigator.geolocation.watchPosition((position)=>{
const alt = {
lat:position.coords.latitude,
long:position.coords.longitude
}
setAltitude(alt);
console.log(altitude);
})
}
return(
<div id="location">
{getAltitude()}
<h3>This is location</h3>
</div>
)
}
但是上面的程序也可以不使用state来写,如下图
import React,{useState} from 'react';
export const City = ()=>{
let lat;
let long;
const getAltitude=()=>{
navigator.geolocation.watchPosition((position)=>{
lat = position.coords.latitude;
long = position.coords.longitude;
})
console.log(lat,long);
}
return(
<div id="location">
{getAltitude()}
<h3>This is location</h3>
</div>
)
}
如果我们也可以这样写,那么状态在反应中的用途是什么。 如果我错了,我要求你详细解释我。除非这个疑问没有弄清楚,否则我无法入睡。
【问题讨论】:
-
如果您使用常规变量,那么如果/当这些变量发生变化时,您的组件将不会重新渲染。例如:如果
watchPosition的回调在一段时间内多次执行,而不使用setAltitude,您的组件将只会渲染初始 JSX 而不会使用更新值渲染它(请注意,经常使用状态值在返回的 JSX 中呈现给用户,因此您希望组件在变量/状态更改时重新呈现) -
您的示例在每次渲染时都添加了一个新的监视处理程序,并且从不清除它们。您不希望注册单个监视处理程序并让它在其成功回调中更新状态。您还想在卸载时清除它。查看 useEffect 及其与 useState 的交互。
标签: javascript reactjs