函数代码如下
class networkEngine{
get(req){
req.type = 'get' ;
req.dataType = 'json' ;
req.cache = 'false' ;
req.beforeSend = xhr =>{
xhr.setRequestHeader('siXtRq3jPQlKpfKa15PFN6cS-gzGzoHsz ','u5SyAXObPG19dqtpnt1NOnoe ') ;
} ;
$.ajax(req) ;
}
tests(){
console.log("test1")
}
}
export { networkEngine as default } ;
组件中的代码如下
import networkEngine from './../Server/networkEngine' ;
class Teamholl extends React.Component {
componentDidMount() {
networkEngine.tests()
}
render(){
return (
<div>...</div>
) ;
}
}
export { Teamholl as default } ;
报错信息如下
Uncaught TypeError: _networkEngine2.default.tests is not a function
我有几点疑问:
1,为什么我的类名是networkEngine报错信息却提示_networkEngine2.default.tests不是函数。
2,正确的调用方式是什么?
3,ajax的get请求,如何传递返回值?
我是前端初学,希望可以讲具体一点,谢谢。
你的import/export语法错了,你问的问题,因为代码被编译过,所以模块和函数名变了。
1、 babel 编译的代码就是这样的,比如:
原始代码:
import Test from './test';
Test.hehe();
编译之后应该是:
'use strict';
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _test = require('./test');
var _test2 = _interopRequireDefault(_test);
_test2['default'].hehe();
2、 你定义的 tests
方法是类 networkEngine
的实例方法,需要先实例化才能调用
new networkEngine().tests();
如果你不想实例化就调用,那就需要定义成静态方法:
networkEngine.tests = function() {
console.log('静态方法 tests');
}
提示:类名最好首字母大写,NetworkEngine
3、 ajax 请求是异步的,拿返回值只能通过回调函数了
networkEngine变networkEngine2是因为babel编译的原因,tests不是函数的错误,是因为tests不是networkEngine的静态方法(类方法),
tests而是一个实例方法,需要在实例上调用。比如
var networkEngine = new NetworkEngine(); networkEngine.tests()
。或者把tests改为静态方法(static tests(){}
),就可以像你这样调用。ajax get可以参考http://www.w3school.com.cn/jquery/ajax_get.asp
又到了把我写的小函数拿出来用的时候了,自认为还是比较简单好用的
const AjaxGet = function( method, url, callback ){
var xhr = new XMLHttpRequest()
xhr.open(method, url, true)
xhr.withCredentials = true
xhr.send()
xhr.onreadystatechange = function(){
if((xhr.readyState == XMLHttpRequest.DONE) && (xhr.status == 200)){
callback(JSON.parse(xhr.responseText))
}else{
callback({errno:false})
}
}
}
export default AjaxGet
使用的话举例,GET方式,还有delete方式都可以用这个
import AjaxGet from 'libs/ajaxGet.js'
AjaxGet('GET', '/api/user/initme', (res) => {
if (res.errno) {
this.setState({
me: res.meData
})
} else if (res.message === 'nologin') {
alert("无法获得用户信息,将回到登陆页面")
window.location = "/login"
}
})
send的话需要多传入一个发送的数据
无非就是提取出ajax时候必须的几个元素,封装掉那些对于你项目不需要的地方,不需要通过class的形式,只是一个普通的函数而已,类似于react的无状态组件,你看无状态组件其实也是一个函数。传入一个callback,ajax完成的时候会调用它。我这里res.errno本来是指望服务器传回一些错误代码的,然而后来嫌麻烦就没有定义,只是传回true和false了
AjaxSend放下面来,方便你看。 post,put都可以用ajaxSend
const AjaxSend = function( action, url, data, callback) {
var xhr = new XMLHttpRequest()
xhr.open(action, url, true)
xhr.withCredentials = true
xhr.setRequestHeader("Content-type", "application/json");
xhr.onreadystatechange = function(){
if ((xhr.readyState == XMLHttpRequest.DONE) && (xhr.status == 200)) {
callback(JSON.parse(xhr.responseText))
}
}
xhr.send(JSON.stringify(data))
}
export default AjaxSend
在 ES6 中使用 class
新建一个类时,在 import 中使用的时候要 new
一下:
import networkEngine from './../Server/networkEngine' ;
...
const request = new networkEngine();
request.tests(); // test1
...