'this' 在 Reflux.createStore() 中未定义
'this' undefined in Reflux.createStore()
我试图在我的 Reflux 商店中通过 this
设置状态属性,但每当我尝试设置 属性 时,我都会收到以下错误:
Uncaught TypeError: Cannot read property 'triggers' of undefined
我使用 Babel 来编译我的 JSX,所以不确定这是否是问题所在,但我非常怀疑。
import Reflux from 'reflux';
import BoardActions from '../actions/BoardActions';
const BoardStore = Reflux.createStore({
listenables: [BoardActions],
getInitialState: () => {
return {
boards: []
};
},
init: (state = undefined) => {
if (state) {
this.state = state;
}
this.triggers(this.state); <----- Getting the error here
// this.state = { boards: [] }; <----- This would also fail
},
...
});
这是 BoardActions:
import Reflux from 'reflux';
import BoardSource from '../sources/BoardSource';
const BoardActions = Reflux.createActions({
'fetch': { children: ['fetching', 'completed', 'failed'] }
});
BoardActions.fetch.listen(() => {
BoardSource.fetch().then((data) => {
BoardActions.fetch.completed(data);
});
});
export default BoardActions;
谢谢!
更新
我可以看到编译器正在将编译后的代码中的this
转换为undefined
,如下所示:
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _reflux = require('reflux');
var _reflux2 = _interopRequireDefault(_reflux);
var _BoardActions = require('../actions/BoardActions');
var _BoardActions2 = _interopRequireDefault(_BoardActions);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var BoardStore = _reflux2.default.createStore({
listenables: [_BoardActions2.default],
init: function init() {
undefined.test = 'test';
},
onFetch: function onFetch() {},
onFetchFetching: function onFetchFetching() {},
onFetchCompleted: function onFetchCompleted(boards) {
undefined.boards = boards;
undefined.trigger(undefined.boards);
},
onFetchFailed: function onFetchFailed() {}
});
exports.default = BoardStore;
//# sourceMappingURL=BoardStore.js.map
但仍然不知道为什么它会将 this
转译为 undefined
。
因为您使用箭头函数来定义对象的方法(对于您传递给 Reflux.createStore
的方法)。
在箭头函数中 this
是词法范围的,这意味着,在您的问题的上下文中,它是 undefined
,因为它在词法上绑定到包含模块(无论是什么) .
参见 Babel online editor 中的示例。
查看 further explanation 个案的更多信息。
注意:我假设您熟悉基础知识,否则 here 是一本关于 ES6 的好书中的好文章的link。
问题似乎是由使用箭头函数引起的。
这应该有效:
const BoardStore = Reflux.createStore({
...
init(state = undefined) {
if (state) {
this.state = state;
}
this.triggers(this.state);
// this.state = { boards: [] };
},
...
});
我试图在我的 Reflux 商店中通过 this
设置状态属性,但每当我尝试设置 属性 时,我都会收到以下错误:
Uncaught TypeError: Cannot read property 'triggers' of undefined
我使用 Babel 来编译我的 JSX,所以不确定这是否是问题所在,但我非常怀疑。
import Reflux from 'reflux';
import BoardActions from '../actions/BoardActions';
const BoardStore = Reflux.createStore({
listenables: [BoardActions],
getInitialState: () => {
return {
boards: []
};
},
init: (state = undefined) => {
if (state) {
this.state = state;
}
this.triggers(this.state); <----- Getting the error here
// this.state = { boards: [] }; <----- This would also fail
},
...
});
这是 BoardActions:
import Reflux from 'reflux';
import BoardSource from '../sources/BoardSource';
const BoardActions = Reflux.createActions({
'fetch': { children: ['fetching', 'completed', 'failed'] }
});
BoardActions.fetch.listen(() => {
BoardSource.fetch().then((data) => {
BoardActions.fetch.completed(data);
});
});
export default BoardActions;
谢谢!
更新
我可以看到编译器正在将编译后的代码中的this
转换为undefined
,如下所示:
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _reflux = require('reflux');
var _reflux2 = _interopRequireDefault(_reflux);
var _BoardActions = require('../actions/BoardActions');
var _BoardActions2 = _interopRequireDefault(_BoardActions);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var BoardStore = _reflux2.default.createStore({
listenables: [_BoardActions2.default],
init: function init() {
undefined.test = 'test';
},
onFetch: function onFetch() {},
onFetchFetching: function onFetchFetching() {},
onFetchCompleted: function onFetchCompleted(boards) {
undefined.boards = boards;
undefined.trigger(undefined.boards);
},
onFetchFailed: function onFetchFailed() {}
});
exports.default = BoardStore;
//# sourceMappingURL=BoardStore.js.map
但仍然不知道为什么它会将 this
转译为 undefined
。
因为您使用箭头函数来定义对象的方法(对于您传递给 Reflux.createStore
的方法)。
在箭头函数中 this
是词法范围的,这意味着,在您的问题的上下文中,它是 undefined
,因为它在词法上绑定到包含模块(无论是什么) .
参见 Babel online editor 中的示例。
查看 further explanation 个案的更多信息。
注意:我假设您熟悉基础知识,否则 here 是一本关于 ES6 的好书中的好文章的link。
问题似乎是由使用箭头函数引起的。
这应该有效:
const BoardStore = Reflux.createStore({
...
init(state = undefined) {
if (state) {
this.state = state;
}
this.triggers(this.state);
// this.state = { boards: [] };
},
...
});