gpt4 book ai didi

javascript - 与React接口(interface)通信异步加载端

转载 作者:行者123 更新时间:2023-12-03 01:40:24 26 4
gpt4 key购买 nike

有一个名为 JSONHeader 的类,它帮助我们加载每个 JSON:

import jQuery from 'jquery-ajax';
import Atlas from "./Atlas";

export default class JSONHeader {
constructor(location) {
loadAtlasStructure(location);

function loadAtlasStructure(location) {
jQuery.ajax({
dataType: "json",
url: location,
async: true,
success: function (files) {
files.map((file) => {
jQuery.ajax({
dataType: "json",
url: location + file,
async: true,
success: function (data) {
console.log(data);
if (!window.IndexAtlas) {
window.IndexAtlas = new Atlas();
}
window.IndexAtlas.addSubAtlas(data);
console.log('JSONHeader::window.IndexAtlas', window.IndexAtlas);
}
});
})
}
})
}
}
}

我想在加载所有 json 后将 React 的顶级组件:App 从 isLoading: true 更改为 isLoading: false。我们怎样才能实现这种行为?目前,每次重新加载所有 JSON 时,我都强制等待 5 秒

import React, {Component} from 'react';
import BrowserRouter from "react-router-dom/es/BrowserRouter";
import Switch from "react-router-dom/es/Switch";
import Route from "react-router-dom/es/Route";
import Redirect from "react-router-dom/es/Redirect";
import ScenePage from "../ScenePage/index";
import CoverPage from "../CoverPage/index";
import {INDEX, SCENE_PAGE} from "../../constantRoutes";
import JSONHeader from "../../newModel14Junio/JSONHeader";

export default class App extends Component {
constructor(props) {
super(props);

const header = new JSONHeader('/atlas/json/');

this.state = {
isAtlasLoading: true
};

setTimeout(() => {
this.setState({isAtlasLoading: false});
}, 5000);
}

render() {
if (this.state.isAtlasLoading) {
return (<div>Atlas loading</div>);
}
return (
<BrowserRouter>
<div>
<Switch>
<Route exact path={INDEX} component={CoverPage}/>
<Route path={SCENE_PAGE} component={() => <ScenePage IndexAtlas={window.IndexAtlas}/>}/>
<Redirect from="*" to={INDEX}/>
</Switch>
</div>
</BrowserRouter>
);
}
}

感谢您的帮助。

最佳答案

使用超时来执行此操作不是一个好主意,因为您不知道需要多少时间才能完成。因此,您可以向 JSONHeader 添加回调,如下所示:

import jQuery from 'jquery-ajax';
import Atlas from "./Atlas";

export default class JSONHeader {
constructor(location, callback) {
loadAtlasStructure(location);

function loadAtlasStructure(location, callback) {
jQuery.ajax({
dataType: "json",
url: location,
async: true,
success: function (files) {
files.map((file) => {
jQuery.ajax({
dataType: "json",
url: location + file,
async: true,
success: function (data) {
console.log(data);
if (!window.IndexAtlas) {
window.IndexAtlas = new Atlas();
}
window.IndexAtlas.addSubAtlas(data);
console.log('JSONHeader::window.IndexAtlas', window.IndexAtlas);
callback();
}
});
})
}
})
}
}
}

在 ReactJS 中,您只需创建一个回调并在调用 JSONHeader 时传递它:

import React, {Component} from 'react';
import BrowserRouter from "react-router-dom/es/BrowserRouter";
import Switch from "react-router-dom/es/Switch";
import Route from "react-router-dom/es/Route";
import Redirect from "react-router-dom/es/Redirect";
import ScenePage from "../ScenePage/index";
import CoverPage from "../CoverPage/index";
import {INDEX, SCENE_PAGE} from "../../constantRoutes";
import JSONHeader from "../../newModel14Junio/JSONHeader";

export default class App extends Component {
constructor(props) {
super(props);

const finishCallback = () => {
this.setState({isAtlasLoading: false});
};

const header = new JSONHeader('/atlas/json/', finishCallback);

this.state = {
isAtlasLoading: true
};
}

render() {
if (this.state.isAtlasLoading) {
return (<div>Atlas loading</div>);
}
return (
<BrowserRouter>
<div>
<Switch>
<Route exact path={INDEX} component={CoverPage}/>
<Route path={SCENE_PAGE} component={() => <ScenePage IndexAtlas={window.IndexAtlas}/>}/>
<Redirect from="*" to={INDEX}/>
</Switch>
</div>
</BrowserRouter>
);
}
}

希望对您有帮助。

关于javascript - 与React接口(interface)通信异步加载端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50874491/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com