我们有一个反应式应用程序,该应用使用Redux,redux-persist和HeadlessJS任务。此任务需要访问商店。由于任务启动而不启动整个应用程序(因此默认没有访问),我们认为我们也可以简单地在任务内创建商店,以便由Redux-Persist重新补充它。但是,事实证明,以这种方式创建的商店与应用程序中的商店不同:运行后,它们包含不同的值。我们以几种方式对此进行了测试,这确实是商店的一个问题(例如,没有采取行动)我们应该如何从HeadlessJS任务访问Redux商店?
相关代码: store/configure.js
:
configureStore = (client) => {
const middleware = createMiddleware(client);
const finalCreateStore = applyMiddleware(thunk, middleware, logger)(createStore);
const store = finalCreateStore(rootReducer, undefined, autoRehydrate());
return store;
};
在使用(在应用程序和服务中):
const client = new ApiClient();
const store = configureStore(client);
client.setStore(store);
persistStore(store, {
storage: AsyncStorage,
}
在应用程序中,我们只需使用React-Redux提供的提供商来使用商店,在服务中,我们使用store.dispatch。
寻找解决方案的人。我在这里找到了解决方案。这个想法是将商店与异步方法结合。
https://github.com/reaect-native-kit/reaeact-native-native-track-player/issues/63
在此处复制解决方案。
// index
const store = ...
....registerHeadlessTask('TrackPlayer', () => require('event-handler.js').bind(null, store));
// event-handler.js
module.exports = async (store, data) {
if(data.type == '...') {
store.dispatch(...);
}
};
也只需在任务内创建商店,以便将其补充为Redux-Persist。
确实发生了。
您创建了两家商店(不适合使用Redux),这些商店都没有水合,但没有链接,因为没有链接的Redux商店。每次您运行股票时,这都是一家新商店。每当您派遣时,您都会在特定的商店中这样做。
不幸的是,异步或多线程问题不是由Redux直接解决的。
尽管使用中间件和/或商店听众可以使两个商店保持同步。
,但是redux也不是线程之间的通信的均值(我认为这些任务是这些任务,或者您可以在创建商店后将任务作为对该任务的参考,或者将主应用程序从任务中授予商店参考)。
这更多的是命令标志性分离和集中状态的一种形式。
您可以直接访问商店作为参考。
假设您在index.js
中的无头设置,然后您只需在此处使用商店:
import { AppRegistry } from 'react-native';
import Store from './src/Redux/Store';
import { someAction } from './src/Redux/Actions/someActions';
import App from './App';
import { name as appName } from './app.json';
const HeadlessTask = async () => {
console.log('Receiving HeadlessTask');
const someParam = await Store.getState().Something.someParam;
if (someParam) {
Store.dispatch(someAction(someParam));
} else {
Store.dispatch(someAction());
}
};
AppRegistry.registerHeadlessTask('HeadlessTask', () => HeadlessTask);
AppRegistry.registerComponent(appName, () => App);