Reactjs 将OData结果映射到组件中
我试图用OData服务的结果填写一个列表,我在我的项目中添加了以下Rest库: 我创建的客户端类如下所示:Reactjs 将OData结果映射到组件中,reactjs,react-native,odata,Reactjs,React Native,Odata,我试图用OData服务的结果填写一个列表,我在我的项目中添加了以下Rest库: 我创建的客户端类如下所示: import RestClient from 'react-native-rest-client'; export default class ServiceOrdersOData extends RestClient { constructor () { super('https://my000000.sapbydesign.com/sap/
import RestClient from 'react-native-rest-client';
export default class ServiceOrdersOData extends RestClient {
constructor () {
super('https://my000000.sapbydesign.com/sap/byd/odata/analytics/ds/Crmsoscb.svc', {
headers: {
Authorization: 'Basic X1NFSURPUjpJbmljaW8wMQ=='
},
});
}
getServiceOrdersOData () {
// Send the url query as an object
return this.GET('/Crmsoscb');
}
};
这很好,现在在实际屏幕中,我添加了一个按钮并处理了它的onPress事件
CallOData(){
const api = new ServiceOrdersOData();
const odataValues = api.getServiceOrdersOData();
console.log(odataValues);
}
如果我检查控制台,我可以看到odataValues正在返回来自OData服务的所有记录,如果在浏览器中执行,这些记录的格式如下:
{
"d": {
"results": [
{
"__metadata": {
"uri": "https://my000000.sapbydesign.com/sap/byd/odata/analytics/ds/Crmsoscb.svc/Crmsoscb('.7~0000000000011DDFBEA73CE3794B5D1A')",
"type": "CrmsoscbSvc.CrmsoscbType"
},
"ID": ".7~0000000000011DDFBEA73CE3794B5D1A",
"C_DbaServiceOrg": "00000000-0001-1DDF-B9FF-7D69E6266BF2",
"C_DicIncCataId": "0000000000000000010010000",
"C_DicIncCatId": "0000000000000000010014172",
"C_DocId": "00000000000000000000000000000000001",
"C_DocPostDate": "/Date(1290729600000)/",
"C_DocSAgCorLc": "3",
"C_DocUuid": "00000000-0001-1DDF-BEA7-3CE3794B5D1A",
"C_DpyBuyerCntry": "US",
"C_DpyBuyerPoscd": "14204",
"C_DpyBuyerPty": "00000000-0001-1DDF-BA84-90748A78DCE3",
"C_DpyBuyerRegn": "NY",
"C_DpyBuyAbc": "A",
"C_DpyBuyCity": "Buffalo",
"C_DpyBuyInds": "42",
"C_DpyBuyIndscsy": "0005",
"C_DpyBuyNieid": "",
"C_DpyProcPty": "00000000-0001-1DEF-BAD7-B58B002BEC36",
"C_DpySalesUnit": "00000000-0001-1DDF-B9FF-7D69E6266BF2",
"C_DpySrvsupTeam": "00000000-0001-1DDF-B9FF-7D69E6266BF2",
"C_DpySrvExTeam": "00000000-0001-1DDF-B9FF-7D69E6266BF2",
"C_DpySrvPerform": "00000000-0001-1DEF-BAD7-B5BC90EE6C36",
"C_DroMatProcCat": "00000000-0001-1DEF-BA9F-2DABDB415385",
"C_DroMatProdTy": "1",
"C_DroRefoIndmat": "00000000-0001-1DEF-BAEB-6DD8248A2BA6",
"C_DroRefoMat": "00000000-0001-1DEF-BAEA-3DA13AD047A6",
"C_DsrProcCataid": "0000000000000000010010000",
"C_DsrProcCatid": "0000000000000000010014000",
"C_DsrSrvPrior": "3",
"C_DsrWarranty": null,
"C_DttInitMonth": "--11",
"C_DttInitQuartr": "--Q4",
"C_DttInitRecDt": "/Date(1290729600000)/",
"C_DttInitWeekdy": "5",
"C_DttInitYear": "2010",
"C_DttInitYrmon": "2010-11",
"C_DttInitYrquar": "2010-Q4",
"C_DttInitYrweek": "2010-W47",
"T_DocName": "Combi 75: Below average heat output",
"NodeId": "0000000000011DDFBEA73CE3794B5D1A",
"Count": 1
}
]
}
}
我现在要做的是在屏幕上用这些记录填写一个列表,比如说用T_DocName和C_DocId
我知道一个叫做map的函数,但我不知道如何在这种特殊情况下使用它
提前感谢您的帮助
编辑:
因此,我尝试了一些建议,但当我尝试获取odataValues.d.results时,它会给我以下错误:无法读取未定义的属性“results”
我相信这与这样一个事实有关,即回复的不是收藏,而是所谓的承诺?我附上了一个返回的console.log本身的屏幕截图:
如你所见,这里有一个奇怪的结构,我的回答包含在下面:
_55:
d:{results: Array(291)}
有什么建议吗
再次感谢 所以您有这些ODataValue,并且可能应该在收到它们时将它们保存到state。然后,在“渲染”中,可以按如下方式渲染结果:
return (
<View> {/* not necessary, this is only a mock of the rest of your layout */}
{this.state.odataValues.d.results.map(result => <ResultRenderer result={result} />)}
</View>
)
返回(
{/*没有必要,这只是对布局其余部分的模拟*/}
{this.state.odataValues.d.results.map(result=>)}
)
ResultTrender应该是一个组件,用于呈现它接收到的道具
我在这里演示如何映射这些值,因为这是您所要求的。然而,一个更好的选择是使用平面列表,因为如果您有一个很长的子列表,它将只在屏幕上呈现这些子列表,节省不必要的处理。你这样使用它:
<FlatList
data={this.state.odataValues.d.results}
renderItem={result => <ResultRenderer />}
/>
}
/>
[StartCaveat]
您需要看看MDN for map:该站点有大量关于所有javascript和其他内容的信息
[结束警告]
若要使用map,必须首先确保所需的结果将在数组中,您可以通过以下方式执行此操作:
if(typeof(odataValues.d.results) != "undefined"){
}
现在我们知道我们可以访问该值,事实上,它确实存在于范围内,我们可以使用map
odataValues.d.results.map(item => {
console.log("DocName", item.T_DocName);
console.log("CDocId", item.C_DocId);
});
以上内容将写入控制台,包括t_DocName和C_DocId。但是,我们需要在屏幕上获取这些数据
为此,我们可以采取以下措施:
<FlatList
data={this.state.dataToDisplay}
renderItem={({item}) => <Text>{`T_Doc: ${item.T_DocName} C_Doc ${item.C_DocId}`}</Text>}
/>
太好了,我们有一个包含我们需要的值的状态,现在只需将平面列表添加到渲染中,检查数据,您就完成了
render() {
return (
this.state.dataToDisplay && (<FlatList
data={this.state.dataToDisplay}
renderItem={({ item }) => <Text>{`T_Doc: ${item.DocName} C_Doc ${item.DocId}`}</Text>}
/>)
)
}
render(){
返回(
this.state.dataToDisplay&({T_Doc:${item.DocName}C_Doc${item.DocId}`}
/>)
)
}
现在你应该可以在屏幕上看到你的数据了!是的,这个答案包括很多假设的引导。例如,您根本不知道用户有状态。你已经假设了,这也不能从他们的代码片段中暗示出来。您似乎还假设他们将能够创建一个显示文本的辅助组件。你似乎还假设odataValues总是会有结果,而那些结果总是会有孩子。我不是假设他有状态。他必须保存一些数据,并且应该使用state来保存。此外,他也不会“无法”创建辅助组件,我通过辅助组件对其进行解释只是因为它提高了可读性。然而,这很容易被其他任何东西所取代。最后,当然,生产应用程序应该对输入进行消毒。然而,这不是问题的重点,没有理由用这些东西来让答案过于复杂。谢谢你的反馈,伙计,我刚刚用我发现的一些东西更新了帖子,你能给我一些见解吗?谢谢
render() {
return (
this.state.dataToDisplay && (<FlatList
data={this.state.dataToDisplay}
renderItem={({ item }) => <Text>{`T_Doc: ${item.DocName} C_Doc ${item.DocId}`}</Text>}
/>)
)
}