gpt4 book ai didi

javascript - 数据准备好后如何渲染组件?

转载 作者:行者123 更新时间:2023-12-05 06:42:07 24 4
gpt4 key购买 nike

我正在尝试弄清楚如何在数据准备好时填充/呈现组件?本质上,我有一个脚本可以查询返回数据的服务器,然后解析它并将其放入具有我需要的属性的集合中。然后在另一个文件中,我有正在寻找该对象的 react 组件,但它们同时运行,因此当组件正在寻找它时该对象不存在。

我不确定如何进行。

这是我的组件:

let SliderTabs = React.createClass({
getInitialState: function() {
return { items: [] }
},
render: function() {
let listItems = this.props.items.map(function(item) {
return (
<li key={item.title}>
<a href="#panel1">{item.title}</a>
</li>
);
});

return (
<div className="something">
<h3>Some content</h3>
<ul>
{listItems}
</ul>
</div>
);
}
});

ReactDOM.render(<SliderTabs items={home.data.slider} />,
document.getElementById('slider-tabs'));

我如何获取数据:

var home = home || {};

home = {
data: {
slider: [],
nav: []
},
get: function() {

var getListPromises = [];

$.each(home.lists, function(index, list) {
getListPromises[index] = $().SPServices.SPGetListItemsJson({
listName: home.lists[index].name,
CAMLViewFields: home.lists[index].view,
mappingOverrides: home.lists[index].mapping
})
getListPromises[index].list = home.lists[index].name;
})

$.when.apply($, getListPromises).done(function() {
home.notice('Retrieved items')
home.process(getListPromises);
})
},
process: function(promiseArr) {
var dfd = jQuery.Deferred();

$.map(promiseArr, function(promise) {
promise.then(function() {
var data = this.data;
var list = promise.list;

// IF navigation ELSE slider
if (list != home.lists[0].name) {
$.map(data, function(item) {
home.data.nav.push({
title: item.title,
section: item.section,
tab: item.tab,
url: item.url.split(",")[0],
path: item.path.split("#")[1].split("_")[0]
})
})
} else {
$.map(data, function(item) {
home.data.slider.push({
title: item.title,
url: item.url.split(",")[0],
path: item.path.split("#")[1]
})
})
}
})
})

console.log(JSON.stringify(home.data))
dfd.resolve();
return dfd.promise();
}
}

$(function() {
home.get()
})

最佳答案

在 React 中执行此操作的一种常见方法是跟踪何时获取数据。这可以做到,例如通过在您的状态中使用 isFetching 字段:

// This would be your default state
this.state = {
isFetching: false
};

然后,当您触发请求时(最好在 componentDidMount 中),您可以使用以下方法将 isFetching 设置为 true:

this.setState({ isFetching: true });

最后,当数据到达时,您再次将其设置为 false:

this.setState({ isFetching: false });

现在,在你的渲染函数中你可以做这样的事情:

render () {
return (
<div className="something">
<h3>Some content</h3>
{this.state.isFetching ? <LoadingComponent /> : (
<ul>
{listItems}
</ul>
)}
</div>
)
}

通过使用状态,您不必担心告诉您的组件做某事,而是它对状态的变化使用react并相应地呈现它。

更新:

如果您打算实际使用 React,我建议您将您的方法更改为我上面描述的方法(在 the React docs 中阅读更多内容)。也就是说,将 get 函数中的代码移动到 React 组件的 componentDidMount 函数中。如果那是不可能的,你可能只是等着打电话

ReactDOM.render(
<SliderTabs items={home.data.slider} />,
document.getElementById('slider-tabs')
);

直到您的数据到达。

关于javascript - 数据准备好后如何渲染组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38461706/

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