反应通量存储发出更改不会在两个组件中触发
React Flux Store emitChange Not Firing in Both Components
我有两个不同的组件,它们利用相同的AuthStore
,FacebookUser
和Quiz
。
FacebookUser
组件通过执行login
操作来更新AuthStore
,该操作会导致它执行emitChange
。但是,Quiz
的onChange
处理程序不会触发。
身份验证存储.js
console.log("AuthStore::CREATED");
var AppDispatcher = require('../dispatcher/AppDispatcher');
var EventEmitter = require('events').EventEmitter;
var AuthConstants = require('../constants/AuthConstants');
var assign = require('object-assign');
var CHANGE_EVENT = 'change';
var _user = undefined;
var AuthStore = assign({}, EventEmitter.prototype, {
isLoggedIn: function() {
return _user !== undefined;
},
getUser: function() {
return _user;
},
emitChange: function() {
console.log('AuthStore::emitChange');
this.emit(CHANGE_EVENT);
},
addChangeListener: function(callback) {
console.log('AuthStore::addChangeListener', callback);
this.on(CHANGE_EVENT, callback);
},
removeChangeListener: function(callback) {
this.removeListener(CHANGE_EVENT, callback);
}
});
// Register callback to handle all updates
AuthStore.dispatchToken = AppDispatcher.register(function(action) {
console.log('AuthStore::action', action);
switch(action.actionType) {
case AuthConstants.AUTH_LOGIN:
_user = action.user;
AuthStore.emitChange();
break;
case AuthConstants.AUTH_LOGOUT:
_user = undefined;
AuthStore.emitChange();
break;
default:
// no op
}
});
module.exports = AuthStore;
FacebookUser.jsx
var AuthActions = require('../../actions/AuthActions');
var AuthStore = require('../../stores/AuthStore');
function componentWillMount() {
AuthStore.addChangeListener(this.onChange);
}
function onChange() {
console.log('FacebookUser::onChange');
var user = AuthStore.getUser();
this.setState(user);
}
function populateUserProfile(userId) {
FB.api('/' + userId, {fields: 'email,name'}, function(response) {
console.log('FacebookUser::populateUserProfile', response);
AuthActions.login(response);
}.bind(this));
}
测验.jsx
var AuthStore = require('../../stores/AuthStore');
var QuizStore = require('../../stores/QuizStore');
function componentWillMount() {
AuthStore.addChangeListener(this.onChange);
QuizStore.addChangeListener(this.onChange);
}
function onChange() {
console.log('Quiz::onChange');
var quiz = QuizStore.getQuiz();
if (!quiz.person.email) {
var user = AuthStore.getUser();
quiz.person.email = user.email;
}
this.setState(quiz);
}
应用调度程序.js
var Dispatcher = require('flux').Dispatcher;
module.exports = new Dispatcher();
我以为这些商店是辛格尔顿的,但是,情况似乎并非如此。我知道我错过了一些愚蠢的东西。期待答案!
控制台输出
下面你可以看到FacebookUser::onChange
着火了。我很确定问题是为这两个组件创建了AuthStore
。从AuthStore::CREATED
日志中可以非常明显地看到这一点。
AuthStore::CREATED
QuizStore::create
AuthStore::addChangeListener onChange() {
console.log('Quiz::onChange');
var quiz = QuizStore.getQuiz();
if (!quiz.person.email) {
var user = AuthStore.getUser();
quiz.person.email = user.email;
}
th…
QuizStore::addChangeListener onChange() {
console.log('Quiz::onChange');
var quiz = QuizStore.getQuiz();
if (!quiz.person.email) {
var user = AuthStore.getUser();
quiz.person.email = user.email;
}
th…
AuthStore::CREATED
AuthStore::addChangeListener onChange() {
console.log('FacebookUser::onChange');
var user = AuthStore.getUser();
this.setState(user);
}
FacebookUser::statusChangeCallback Object {authResponse: Object, status: "connected"}
FacebookUser::populateUserProfile Object {email: "mperren@gmail.com", name: "Michael Perrenoud", id: "10209047315608853"}
AuthActions::login
AuthStore::action Object {actionType: "AUTH_LOGIN", user: Object}
AuthStore::emitChange
FacebookUser::onChange
而不是公开构造函数,在您的商店中公开一个实例调用new并公开该实例。这样,它将是一个单一实例,在测试中,我公开了一个非默认导出,以便我可以为每个测试重新初始化一个存储。
所以这个问题最终有点深奥。我用不同的ReactDOM
渲染器包含这个用户组件。有效地喜欢它自己的应用程序。这就是导致问题的原因。因为它们处于不同的范围内,所以它们不共享相同的商店。将组件移动到由应用程序的根组件呈现可以修复它。
相关文章:
- 设置两个反应组件之间状态的正确方式
- React.js不区分同一类的两个组件
- Angular 2,在没有直接关系的两个组件之间共享一个对象
- 如何在html中使用两个组件
- 反应通量存储发出更改不会在两个组件中触发
- 如何让两个不相关的 React 组件一起工作
- 在两个组件之间传输状态
- 当 ASPxPageControl 选项卡页位于两个 ASPxPageControl 标签页中时,我无法访问该组件
- 比较两个组件 - 组件 X 是组件 A 的实例吗?
- 两个网络组件之间的绑定:谷歌地图+地理定位
- 余烬组件插入两个表行
- 传达两个 reactJS 组件
- 在两个同级React.js组件之间传递数据
- Angular 2-我有3个头部组件.如何最好地切换这两个标题
- 如何更新表示相同数据的两个不同React组件实例
- ReactJS-如何在同一页面中创建两个或多个组件
- 使用React.render()渲染的两个组件之间的交互是否可能
- 更新React中两个组件之间的数据
- 两个组件在Angular2中干扰文件事件
- Angular2中两个组件之间的通信