- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 react 中启动状态更改之前触发延迟。这有望使我的套牌 gl 图表动画化。
当前它重新加载页面。
我已经尝试了超时和间隔,但都没有按预期工作。我想我错过了一些与窗口方法工作方式有关的状态。
这是我的功能
yearOnChange = e => {
const data = {
0: jan95,
1: jan00,
2: jan05
};
window.setTimeout(
this.setState({
location: data[e.currentTarget.value],
year: e.currentTarget.value
}),
10000
);
};
这是通过将函数传递给子组件然后通过按钮的 onClick
触发来激活的。
我预计会发生延迟,然后状态会发生变化。
我并不是假装知道这是否是正确的代码、最佳实践或正确的方法。这对我来说是一个新领域,正在寻找最佳实践/解决方案。
如果需要可以编辑代码。
更新:
添加了整个代码以供审查以提供帮助。
至于何时调用它,它只是被传递给一个按钮,并由该按钮触发一个 onClick 事件。
import React, { Component } from "react";
import { StaticMap } from "react-map-gl";
import { H3HexagonLayer } from "@deck.gl/geo-layers";
// import { HexagonLayer } from "@deck.gl/aggregation-layers";
import DeckGL from "@deck.gl/react";
import { jan95, jan00, jan05 } from "../../dummyData/concatData";
// import testData from "../../dummyData/testDataHexNo3.json";
import YearSelector from "../YearSelector/YearSelector";
const MAPBOX_TOKEN =
"pk.eyJ1Ijoiam5hbGV4YW5kZXIxMCIsImEiOiJjaWlobnE4eGswMDFld2RtNmZxMDl3Nzc3In0.UTaIFjrs21qB1npSeliZbQ";
const mapStyle =
"mapbox://styles/jnalexander10/cj0xo73a300rr2rta4ny2bj0d/draft/";
const INITIAL_VIEW_STATE = {
longitude: 0.1278,
latitude: 51.5074,
zoom: 7,
minZoom: 5,
maxZoom: 10,
pitch: 50,
bearing: -27.396674584323023
};
const elevationScale = { min: 0, max: 10 };
class FirstMap extends Component {
constructor(props) {
super(props);
this.state = {
location: "",
year: 0,
elevationScale: elevationScale.min
};
this.startAnimationTimer = null;
this.intervalTimer = null;
this._startAnimate = this._startAnimate.bind(this);
this._animateHeight = this._animateHeight.bind(this);
}
componentDidMount() {
this.setState({
location: jan95
});
this._animate();
}
_animate() {
this._stopAnimate();
// wait 1.5 secs to start animation so that all data are loaded
this.startAnimationTimer = window.setTimeout(this._startAnimate, 3500);
}
_startAnimate() {
this.intervalTimer = window.setInterval(this._animateHeight, 20);
}
_stopAnimate() {
window.clearTimeout(this.startAnimationTimer);
window.clearTimeout(this.intervalTimer);
}
_animateHeight() {
if (this.state.elevationScale === elevationScale.max) {
this._stopAnimate();
} else {
this.setState({ elevationScale: this.state.elevationScale + 1 });
}
}
_layerRendering = () => {
const stateLocation = this.state.location;
const valuesOfState = stateLocation[0];
return [
new H3HexagonLayer({
id: "h3-hexagon-layer",
data: valuesOfState && Object.values(valuesOfState),
pickable: true,
opacity: 0.15,
wireframe: true,
filled: true,
extruded: true,
elevationScale: this.state.elevationScale,
coverage: 50,
getHexagon: d => d.h3Location,
getFillColor: [223, 25, 149], // fluorescent pink
getElevation: d => {
console.log("d.price", d.price * 0.5);
return Number(d.price / 10);
}
})
];
};
// newData = testData;
// newData = eval(testData);
// _layer = new HexagonLayer({
// id: "hexagon-layer",
// data: testData,
// pickable: true,
// extruded: true,
// radius: 200,
// elevationScale: 100,
// // upperPercentile: 100,
// // getElevationValue: d =>
// getPosition: d => d.COORDINATES
// });
dataStateChange = () => {
window.setTimeout(
this.setState({
year: jan00
}),
2000
);
window.setTimeout(
this.setState({
year: jan05
}),
8000
);
};
// yearOnChange = e => {
// const data = {
// 0: jan95,
// 1: jan00,
// 2: jan05
// };
// window.setTimeout(() => {
// this.setState({
// location: data[e.currentTarget.value],
// year: e.currentTarget.value
// });
// }, 10000);
// };
yearOnChange = e => {
e.stopPropagation();
e.nativeEvent.stopImmediatePropagation();
const data = {
0: jan95,
1: jan00,
2: jan05
};
window.setTimeout(
() =>
this.setState({
location: data[e.currentTarget.value],
year: e.currentTarget.value
}),
10000
);
};
render() {
return (
<div
style={{
display: "flex",
justifyContent: "center",
alignItems: "center"
}}
>
<YearSelector
yearOnChange={this.yearOnChange}
year={this.state.year}
dataStateChange={this.dataStateChange}
/>
<DeckGL
// layers={this._layer}
layers={this._layerRendering()}
initialViewState={INITIAL_VIEW_STATE}
controller={true}
>
<StaticMap
reuseMaps
mapStyle={mapStyle}
MapController
preventStyleDiffing={true}
mapboxApiAccessToken={MAPBOX_TOKEN}
/>
</DeckGL>
</div>
);
}
}
export default FirstMap;
最佳答案
问题是您调用 setState 而不是给 setTimeout
一个函数。这就是您要找的:
yearOnChange = e => {
const data = {
0: jan95,
1: jan00,
2: jan05
};
window.setTimeout(
() => this.setState({
location: data[e.currentTarget.value],
year: e.currentTarget.value
}),
10000
);
};
关于javascript - setInterval/setTimeout 可能会导致页面重新加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57893297/
要求:用户连续扫描文本框中的作业编号,没有任何延迟。对于每个职位编号,我需要在后台调用 API 来获取扫描职位编号的详细信息。 我做了什么:我编写了一个小模拟代码来激发这个需求。我使用 setTime
我遇到了一个问题:该代码应该按该顺序输出“hi1”“hi2”“hi3”“hi4”。我写了这个简化的代码,实际代码更复杂,导致我无法删除我标记的一些功能。 function test() { c
我的页面上有一个动态创建的 iframe。像这样: var iframe = document.createElement('iframe'); iframe.setAttribute("id","m
我确信这是一个被问过很多次的通用问题,但找不到解决方案。 我有 javascript 使用 setTimeout() 函数来关闭我在设定时间后创建的弹出窗口。 问题:如果我在与创建弹出窗口的脚本相同的
我想在第一个函数完成后执行第二个函数。 结果: i: 0,i: 1,...,i: 9, j: 0,j: 1,...,j: 9 function first(callback){ for
我正在尝试创建一个按钮,以反馈其正在执行的操作。在 Angular 中,我向服务器发出一个放置请求——此时我更改按钮的状态以指示这一点——然后当我收到响应时,我再次更改按钮的状态以反射(reflect
我正在尝试制作一个字符串,它会逐个字母地写出自己直到完成句子,并且每个字母出现的速度基于从 1 到 10 不等的输入。在字符串的末尾,它会闪烁5 秒,直到外星人出现。我的想法是创建一个 setInte
在 Meteor 中,为什么要使用 Meteor.setTimeout() 而不是普通的 setTimeout()? 使用 Meteor.setTimeout() 而不是单纯的 setTimeout
我有这个代码 - function example() { var i = 0; function add() { i++; } setTimeout(
我想知道它们之间有什么区别 window.setTimeout(myFancyFunciton, 1000); 和 setTimeout(myFancyFunciton, 1000); 两者似乎都在做
好吧,我好像遇到了问题。我正在尝试创建一个twicker 来显示数据行。我正在使用 jquery/javascript 在一定时间后隐藏和显示行。代码如下: var timer_is_on
编辑:我最终想在以后使用 setTimeout 恢复变量的先前值 我创建了以下示例来说明我的观点:( JSFiddle ) Push the button Try it var x = {};
我一直在像这样在没有窗口父级的情况下使用超时: setTimeout(FUNC, 1000); 我很好奇,我应该这样使用它吗? window.setTimeout(FUNC, 1000); 有区别吗?
我有一个使用 setTimeout 函数执行动画的函数,结构如下: animation: function() { //first setTimeout(function(){ mak
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
这是一个快速的(损坏的)jsfiddle:http://jsfiddle.net/wH2qF/ 由于某种原因这不起作用...是因为我在另一个 setTimeout 的处理程序中有一个 setTimeo
我有两个 setTimouts,如下所示,根据 if 条件,我想跳过一个超时。 var batchID = []; batchID = getBatchIDs();//this function ge
我只看到一种情况我应该使用 window.setTimeout 而不是 setTimeout,当我在我的闭包,这显然不是很好的做法(除非有非常特殊的用途)。 我注意到 Google Closure 编
我看到这个用了很多,有人告诉我把函数引用放在引号之间是不好的,因为 setTimeout/setInterval evals 引用。这两者之间的实际区别是什么,以至于一个被使用在另一个之上?为什么我看
我正在使用“setTimeout”函数。此代码按预期运行: function myFunction() { console.log('test'); setTimeout(myFunc
我是一名优秀的程序员,十分优秀!