我构建了一个api,它返回我在DB中注册的单元,但当试图返回这些单元时,这些单元并没有被检查
import React, { Component } from 'react';
import axios from 'axios';
const api = {
units: () => {
axios.get('http://192.168.0.23/api/public/api/units')
.then(response => {
console.log(response);
return response.data.data
}).catch((error) => {
console.log(error.message)
});
return 'Error'
},
};
export default api;
响应正确显示数据,response.data.data
如果在带有类的文件中使用,我可以设置状态单位 = []
,并使用setState
返回单位
然而,我想为api返回创建这个文件,但是因为我不使用类,所以我理解我不能使用状态。
有没有办法不让类返回这些数据,或者保存一个变量或类似的东西?
或者在没有类的情况下使用setState
?
我相信这些将是解决我的问题的方法,但是如果其他人知道,而不是把api调用放在与最终类相同的文件中,可能也是如此。
我也试过这样做:
async function getUnits() {
return await axios.get('http://192.168.0.23/api/public/api/units');
}
getUnits.then((response) => {
console.log(response);
return response.data.data
}).catch((response) => {
console.log(response)
});
但是错误表明getUnits。然后不是一个函数
即使与正常的功能没有工作:
function units() {
axios.get('http://192.168.0.23/api/public/api/units')
.then(response => {
console.log(response);
return response.data.data
}).catch((error) => {
console.log(error.message)
});
return 'Error'
};
如果我遇到你的问题,那么这就是你需要做的:
更改此项:
import React, { Component } from 'react';
import axios from 'axios';
const api = {
units: () => {
axios.get('http://192.168.0.23/api/public/api/units')
.then(response => {
console.log(response);
return response.data.data
}).catch((error) => {
console.log(error.message)
});
return 'Error'
},
};
export default api;
到:
import axios from 'axios';
const api = {
units: () => {
return axios.get('http://192.168.0.23/api/public/api/units')
.then(response => {
console.log(response);
return response.data.data
}).catch((error) => {
console.log(error.message)
});
return 'Error'
},
};
export default api;
在axios之前添加了一个return语句
然后在组件中使用它,如
import api from './api';
....
....
....
componentDidMount() {
api.units().then(units => this.setState({ units }))
}
....
....
....
首先,在这个片段中
async function getUnits() {
return await axios.get('http://192.168.0.23/api/public/api/units');
}
getUnits.then((response) => {
console.log(response);
return response.data.data
}).catch((response) => {
console.log(response)
});
你犯了一个错误,你应该在这里调用getUnits
函数eg
getUnits().then(.....)
关于是否使用有状态组件或功能组件,请查看此处的文档以了解有关差异的一些解释。
第一页讨论不管理自身状态的功能组件。第二页讨论状态。
根据您的情况,其中一个组件必须进行AJAX调用,因此必须有一个组件负责状态。如果您正在使用Redux,对话将变得非常不同。但是,如果不使用Redux,通常情况下,状态将位于高级有状态组件中,其下有无状态组件。基本组件将通过道具(只读)将数据(来自AJAX请求)传递给其无状态子级。
所以最后我们可以得到一些代码!在api
对象中,让我们支持一种将数据传递回调用方的方法。这里我们添加了onLoad
和onError
回调参数,它们接受函数作为参数。当成功响应到达时,将使用来自API的数据调用onLoad
回调。发生错误时,调用带有错误消息的onError
回调。
import axios from 'axios';
const api = {
units: (onLoad, onError) => {
axios.get('http://192.168.0.23/api/public/api/units')
.then(response => {
onLoad(response.data.data);
}).catch((error) => {
onError(error.message);
});
},
};
export default api;
现在,我们将使您的应用程序
组件有状态(请记住,它可以有无状态的子级,通过道具传递数据)。注意,我们在组件装载之前调用API调用,因为我们在React的
componentWillMount
lifecycle方法中调用它。这不会阻止组件渲染,但因为api
对象正在进行异步调用,这只会调用api请求,让组件立即渲染。数据到达后,您的api
对象将调用onLoad
回调,这是App
组件的onApiLoad
方法。App
组件随后将更新其状态并重新渲染!
import React, { Component } from 'react';
import { Platform, StyleSheet, Text, View } from 'react-native';
import api from './units';
export default class App extends Component {
constructor(props) {
super(props);
this.state = {units: []};
}
componentWillMount() {
api.units(this.onApiLoad, this.onApiError);
}
onApiLoad(units) {
this.setState({
units: units
});
}
onApiError(errorMessage) {
// TODO Something meaningful with error message
}
render() {
const unit = this.state.units.map((item, i) => (
<div>
<h1>{ item.example }</h1>
</div>
));
return (
<View style={{ flexGrow: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Units: {unit}</Text>
</View>
);
}
}
使用以下代码,它将帮助您。
通常我们会加载数据,然后渲染我们的应用程序。但是React期望所有数据都有一些初始状态,并且在AJAX请求完成后需要更新自己。因此,需要将所有数据存储在应用的状态中。
这看起来是这样的:
import React, { Component } from 'react';
import { Platform, StyleSheet, Text, View } from 'react-native';
import axios from 'axios';
export default class App extends Component {
constructor(props) {
super(props);
this.state = {units: []};
}
componentDidMount() {
this.getUnits();
}
getUnits() {
axios.get('http://192.168.0.23/api/public/api/units')
.then(response => {
this.setState({ units: response.data.data }));
}).catch((error) => {
console.log(error.message)
});
}
render() {
const unit = this.state.units.map((item, i) => (
<div>
<h1>{ item.example }</h1>
</div>
));
return (
<View style={{ flexGrow: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Units: {unit}</Text>
</View>
);
}
}
如果您希望子组件将数据向下传递给。下面是它的样子:
const unit = this.state.units.map((item, i) => (
<div>
<h1>{ item.example }</h1>
<Test unitData={item} />
</div>
));
在不同的测试中
组件
class Test extends Component { //use the data in a class component
constructor(props) {
super(props);
}
render() {
const unit = this.props.unitData
return (
<div className="test">
<h1>{unit.example}</h1>
</div>
);
}
}
请检查此处的示例,这将帮助您解决问题。
示例:
希望这对你有帮助!!
我有一个YouTube用户,其中不包含YouTube频道。但是,如果我使用“mine=true”属性查询youtube.channels.list API方法,YouTube数据API确实会返回一个频道,如下面的示例(1)所示。 例: (1) 返回一个通道(mine=true;通过使用OAuth): https://developers.google.com/apis-explorer/#p/yo
为什么在尝试访问Twitter API时会出现以下错误? 属性错误回溯(最近调用最后一次)在()17 18--- AttributeError:“模块”对象没有属性“oauth” 我的代码:
这是我的代码:
如您所见,它将参数和的和保存在变量中,然后将包含它们的和的eax寄存器保存在变量中,就像函数返回值一样。 这样做是因为函数是用返回值定义的吗?
问题内容: 在Java中,尝试{…}最终{…}在我看来有点不直观。如另一个问题所示,“最终是否总是在Java中执行?,如果try块中有return语句,则在定义了finally块的情况下将忽略该语句。例如功能 将始终返回false。我的问题:这是为什么?Java做出的这种设计决策背后是否有特定的哲学?我感谢任何见解,谢谢。 编辑:我对“为什么” Java认为可以违反我定义的语义特别感兴趣。如果我在
问题内容: JDK中是否有一个标准功能接口,该接口什么都不做,什么也不返回?我找不到一个。类似于以下内容: 问题答案: 那么Runnable呢: