React Native:HeadSlessJ和Redux-如何从任务访问商店



我们有一个反应式应用程序,该应用使用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);

最新更新