我在sagas.js
中创建了一个rootSaga作为
function* fetchStuff(action) {
try {
yield put({type: 'INCREMENT'})
yield call(delay, 1000)
yield put({type: 'DECREMENT'})
const highlights = yield call(API.getStuff, action.data.myObject);
} catch (e) {
yield put({type: 'FETCH_STUFF_FAILED', message: e});
}
}
export default function* rootSaga() {
yield takeEvery('INIT_LOAD', fetchStuff);
}
我在INIT_LOAD
之后调用thirdParty.method
:
class myClass extends Component {
constructor(props) {
super(props);
}
componentDidMount() {
this.load();
}
load = () => {
this.init = () => {
this.myObject = thirdParty.method(event => {
const action = {
type: 'INIT_LOAD',
payload: {
myObject: this.myObject
}
};
store.dispatch(action);
});
};
this.init();
};
render() {
return (
<div id="render-here" />
);
}
在调度的动作中传递this.myObject
不会触发传奇。如果我将动作有效负载更改为字符串,如下所示,则会触发传奇。
const action = {
type: 'INIT_LOAD',
payload: {
myObject: 'this.myObject'
}
};
为什么我无法传递this.myObject
但是字符串没问题?
更新:这不是一个传奇问题。我用简单的redux复制了同样的问题。 rootReducer
为
export default function rootReducer(state = initialState, action) {
switch (action.type) {
case 'INIT_LOAD':
return Object.assign({}, state, { myObject: action.payload.myObject });
default:
return state;
}
}
正如我在下面的评论中提到的,将其分配给对象Obj
不会改变问题
let Obj = {};
...
load = () => {
this.init = () => {
Obj.myObject = thirdParty.method(event => {
const action = {
type: 'INIT_LOAD',
payload: {
myObj: Obj
}
};
store.dispatch(action);
});
};
this.init();
};
UPDATE2
我清理了代码&amp;只需在触发传奇的组件中调度一个动作。传奇内部是我init()
的所在地。我遇到了另一个问题,我试图在redux存储中保存的对象具有活动的套接字会话(给了我cross-domain
个问题)。虽然我没有解决原来的问题,但是没有存储套接字对象会让我的问题消失。