如何解决React useEffect 迟到了
我有一张州地图。地图包含坐标并作为道具进入反应传单。我正在使用 useEffect 更新地图,但它工作得很晚,初始值作为道具消失了。
const [map,setMap] = useState([0,0]);
useEffect(() => {
const data = getIp();
data.then(result => {
setMap([result.lat,result.lon]);
})
},[])
console.log(map);
console.log 视图:
Array [ 0,0 ]
Array [ 36.8943,30.7209 ]
解决方法
useEffect 钩子在第一次渲染之后运行,所以如果你想避免第一次渲染,你可以在你的状态中使用一个加载器并使用它来有条件地渲染内容:
function start() {
// TAB PAGE SELECTION
var win = Titanium.UI.createWindow({
backgroundColor:'#000',});
win.backgroundcolor='#000000';
win.navTintColor = "black";
var overlay = Titanium.UI.createView();
var overlay1 = Titanium.UI.createImageView();
var imageUnicorn = Ti.Filesystem.getFile(Titanium.Filesystem.resourcesDirectory,'/images/pika.png');
overlay1.image = imageUnicorn;
var olt = Ti.UI.createMatrix2D();
var Count = 0;
overlay1.addEventListener('click',function(e) {
Count = Count + 1;
switch (Count) {
case 0:
overlay1.transform = Ti.UI.createMatrix2D().rotate(0);
break;
case 1:
overlay1.transform = Ti.UI.createMatrix2D().rotate(90);
break;
case 2:
overlay1.transform = Ti.UI.createMatrix2D().rotate(180);
break;
case 3:
overlay1.transform = Ti.UI.createMatrix2D().rotate(270);
Count = -1;
break;
}
});
// MOVING
var curX,curY;
overlay1.addEventListener('touchstart',function(e) {
curX = e.x;
curY = e.y;
});
var deltaX,deltaY;
overlay1.addEventListener('touchmove',function(e) {
deltaY = e.y - curY;
deltaX = e.x - curX;
olt = olt.translate(deltaX,deltaY);
overlay1.animate({
transform : olt,duration : 10
});
});
// PINCH TO ZOOM
overlay1.addEventListener('pinch',function(e){
olt = Ti.UI.createMatrix2D().scale(e.scale);
overlay1.animate({
transform : olt,duration : 10
});
});
overlay.add(overlay1);
Ti.Media.showCamera({
allowEditing : false,showControls : false,overlay : overlay,mediaTypes : [Ti.Media.MEDIA_TYPE_PHOTO],autohide : false,});
return win;
};
module.exports = start;
,
根据 React 文档:https://reactjs.org/docs/hooks-reference.html
默认情况下,效果会在每次完成渲染后运行,但您可以 选择仅在某些值发生更改时触发它们。
所以你的 useEffect 会在第一次渲染后起作用,这是正常的行为。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。