GVKun编程网logo

react-native-router-flux popTo('想pop到的scene') 回退多级不能实现问题(react回退保持页面状态)

1

最近很多小伙伴都在问react-native-router-fluxpopTo('想pop到的scene')回退多级不能实现问题和react回退保持页面状态这两个问题,那么本篇文章就来给大家详细解答一

最近很多小伙伴都在问react-native-router-flux popTo('想pop到的scene') 回退多级不能实现问题react回退保持页面状态这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”、Flux v2 是 Argo Flux 的替代品、Flux 在 Webclient 和简单的 Flux.just 中表现不同、Flux.mergeOrdered() 不对 Flux 进行排序等相关知识,下面开始了哦!

本文目录一览:

react-native-router-flux popTo('想pop到的scene') 回退多级不能实现问题(react回退保持页面状态)

react-native-router-flux popTo('想pop到的scene') 回退多级不能实现问题(react回退保持页面状态)

我测试的react-native-router-flux版本是

"version": "4.0.0-beta.24":

修改地方:

1、将src/Reducer下第54行

// while (nextScene !== currentScene && newState && nextScene !== routeName) {

修改为

while (newState && nextScene !== routeName) {

2、将dist/Reducer下75行的

// createReducer;var _navigationStore=require(''./navigationStore'');var _navigationStore2=_interoprequiredefault(_navigationStore);var _ActionConst=require(''./ActionConst'');var ActionConst=_interopRequireWildcard(_ActionConst);var _reactNavigation=require(''react-navigation'');var _State=require(''./State'');function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}function _interoprequiredefault(obj){return obj&&obj.__esModule?obj:{default:obj};}function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}var supportedActions=exports.supportedActions=(_supportedActions={},_defineProperty(_supportedActions,ActionConst.PUSH,_reactNavigation.NavigationActions.NAVIGATE),ActionConst.BACK,_reactNavigation.NavigationActions.BACK),ActionConst.REFRESH,ActionConst.RESET,_reactNavigation.NavigationActions.RESET),_supportedActions);var createAction=function createAction(type){return function(){var payload=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return _extends({type:type},payload);};};function reducer(){var state=arguments.length>0&&arguments[0]!==undefined?arguments[0]:_navigationStore2.default.state;var action=arguments[1];var type=action.type;var routeName=action.routeName;if(supportedActions[type]){var newState=_navigationStore2.default.router.getStateForAction(createAction(supportedActions[type])({routeName:routeName,params:action.params}),state);return newState||state;}if(type===ActionConst.JUMP){var _newState=_navigationStore2.default.router.getStateForAction(_reactNavigation.NavigationActions.navigate({routeName:routeName,state);var activeState=(0,_State.getActiveState)(state);if(activeState.routeName===''DrawerOpen''){activeState=(0,_State.getActiveStateExceptDrawer)(state);if((0,_State.isActiveRoute)(state,routeName)){return _navigationStore2.default.router.getStateForAction(_reactNavigation.NavigationActions.navigate({routeName:''DrawerClose''}),state);}}if((0,routeName)){return state;}var key=(0,_State.getActiveState)(_newState).key;return _navigationStore2.default.router.getStateForAction(_reactNavigation.NavigationActions.setParams({key:key,_newState);}else if(type===ActionConst.POP_TO){var nextScene='''';var _newState2=state;var currentState=state;var currentScene=(0,_State.getActiveState)(state).routeName;while(nextScene!==currentScene&&_newState2&&nextScene!==routeName){_newState2=_navigationStore2.default.router.getStateForAction(_reactNavigation.NavigationActions.back(),currentState);if(_newState2){nextScene=(0,_State.getActiveState)(_newState2).routeName;if(nextScene!==routeName){currentState=_newState2;}}}return nextScene===routeName?_newState2:state;}else if(type===ActionConst.REPLACE){var _newState3=_navigationStore2.default.router.getStateForAction(_reactNavigation.NavigationActions.navigate({routeName:routeName,state);return(0,_State.popPrevIoUs)(_newState3);}return _navigationStore2.default.router.getStateForAction(action,state)||state;}function createReducer(){

return reducer;

}


修改为

createReducer;var _navigationStore=require(''./navigationStore'');var _navigationStore2=_interoprequiredefault(_navigationStore);var _ActionConst=require(''./ActionConst'');var ActionConst=_interopRequireWildcard(_ActionConst);var _reactNavigation=require(''react-navigation'');var _State=require(''./State'');function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}function _interoprequiredefault(obj){return obj&&obj.__esModule?obj:{default:obj};}function _defineProperty(obj,value){if(key in obj){Object.defineProperty(obj,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}var supportedActions=exports.supportedActions=(_supportedActions={},ActionConst.REPLACE,_supportedActions);var createAction=function createAction(type){return function(){var payload=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return _extends({type:type},payload);};};function reducer(){var state=arguments.length>0&&arguments[0]!==undefined?arguments[0]:_navigationStore2.default.state;var action=arguments[1];var type=action.type;var routeName=action.routeName;if(supportedActions[type]){var newState=_navigationStore2.default.router.getStateForAction(createAction(supportedActions[type])({routeName:routeName,state);return newState||state;}if(type===ActionConst.JUMP){var _newState=_navigationStore2.default.router.getStateForAction(_reactNavigation.NavigationActions.navigate({routeName:routeName,state);var activeState=(0,_State.getActiveState)(state);if(activeState.routeName===''DrawerOpen''){activeState=(0,_State.getActiveStateExceptDrawer)(state);if((0,routeName)){return _navigationStore2.default.router.getStateForAction(_reactNavigation.NavigationActions.navigate({routeName:''DrawerClose''}),state);}}if((0,routeName)){return state;}var key=(0,_State.getActiveState)(_newState).key;return _navigationStore2.default.router.getStateForAction(_reactNavigation.NavigationActions.setParams({key:key,_newState);}else if(type===ActionConst.POP_TO){var nextScene='''';var _newState2=state;var currentState=state;while(_newState2&&nextScene!==routeName){_newState2=_navigationStore2.default.router.getStateForAction(_reactNavigation.NavigationActions.back(),currentState);if(_newState2){nextScene=(0,_State.getActiveState)(_newState2).routeName;if(nextScene!==routeName){currentState=_newState2;}}}return nextScene===routeName?_newState2:state;}else if(type===ActionConst.POP_AND_PUSH){var _newState3=_navigationStore2.default.router.getStateForAction(_reactNavigation.NavigationActions.back(),state);return _navigationStore2.default.router.getStateForAction(_reactNavigation.NavigationActions.navigate({routeName:routeName,_newState3);}return _navigationStore2.default.router.getStateForAction(action,state)||state;}function createReducer(){

}


OK,就这俩处修改搞定!希望能帮到你

./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”

如何解决./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”

./node_modules/react-router-dom/react-router-dom.js Attempted import error: ''Navigate'' is not exported from ''react-router''.

react-router-dom的版本是6.0.0-alpha.2,而react-router是5.2.0。 两者均已正确安装。我不确定如何解决此错误。有人可以给我任何可能的解决方法吗?

我的代码中甚至没有<Navigate to=?>行。

解决方法

为什么只安装两个都需要,这可以工作

  1. 执行npm删除react-router
  2. 删除node_modules
  3. 纱线安装或npm安装和
  4. 启动纱线或启动npm

Flux v2 是 Argo Flux 的替代品

Flux v2 是 Argo Flux 的替代品

如何解决Flux v2 是 Argo Flux 的替代品

我已经使用 Flux v2 设置了持续交付管道(因为不推荐使用 Flux v1),并且它运行良好。 另一方面,我看到 Argo 和 Flux 在 2019 年底开始合并(请查看此 link)。

我想知道 Flux v2 是 Argo-Flux 合并的演变,还是两个独立的 GitOps 实现选项。

我的印象是 Flux v2 非常活跃,所以我想这是一个真正的选择,至少会存在一段时间。但我对 Argo-Flux 一无所知,找不到太多信息。

谢谢!

解决方法

Flux 和 Argo (argo-flux) 的最初合作是 Argo、Intuit 和 WeaveWorks 之间的合作。该项目后来被称为 GitOps-Engine,该项目现在位于 Argo 项目组织中,由 Intuit、Red Hat 和 GitLab 推动。

合作的初衷是将 GitOps 引擎集成到 Argo 和 Flux v2 中。后来,Flux 团队决定在没有 GitOps 引擎的情况下继续前进,并构建了 GitOps Toolkit,这是一个控制器集合,flux 感觉更适合他们在 Kubernetes 中的 GitOps 愿景。

从某种意义上说,Flux v2 是 GitOps Engine 项目学习的演变,但它不使用引擎。 v2 被认为是 GA,正如您所注意到的,它处于非常活跃的开发阶段。

Flux 在 Webclient 和简单的 Flux.just 中表现不同

Flux 在 Webclient 和简单的 Flux.just 中表现不同

如何解决Flux 在 Webclient 和简单的 Flux.just 中表现不同

我在 Spring 中有基本的 rest 控制器。为了试用 spring webflux 并了解它的非阻塞性质。我创建了两个控制器映射,一个用于读取,另一个用于为 webclient 调用提供服务(如下所示)

  1. @GetMapping("/slow-service-tweets")
  2. private List<String> getAllTweets() {
  3. try {
  4. Thread.sleep(2000L); // delay
  5. } catch (InterruptedException e) {
  6. e.printstacktrace();
  7. }
  8. return Arrays.asList(
  9. "Item1","Item2","Item3");
  10. }

这是我的测试 get api,它只会触发下面给出的代码(第一个版本)

  1. @GetMapping("/test")
  2. public void doSomething(){
  3. log.info("Starting NON-BLOCKING Controller!");
  4. Flux<String> tweetFlux = WebClient.create()
  5. .get()
  6. .uri("http://localhost:9090/slow-service-tweets")
  7. .retrieve()
  8. .bodyToFlux(String.class);
  9. tweetFlux.subscribe(tweet ->{
  10. try {
  11. log.info("i am back");
  12. Thread.sleep(6000L);
  13. } catch (InterruptedException e) {
  14. e.printstacktrace();
  15. }
  16. log.info(tweet.toString());});
  17. log.info("Exiting NON-BLOCKING Controller!");

上面的代码完全按照它应该的方式运行。输出是

  1. Starting NON-BLOCKING Controller!
  2. Exiting NON-BLOCKING Controller!
  3. Item1
  4. Item2
  5. Item3

原因是线程在订阅通量时不会阻塞并继续前进。 现在请看下面的第二个版本。

  1. @GetMapping("/test")
  2. public void doSomething(){
  3. System.out.println("i am here");
  4. Flux<Integer> f= Flux.just(1,2,3,4,5);
  5. // Flux<Integer> f= Flux.fromIterable(testService.returnStaticList());
  6. f.subscribe(consumer->{
  7. try {
  8. log.info("consuming");
  9. Thread.sleep(2000L);
  10. } catch (InterruptedException e) {
  11. e.printstacktrace();
  12. }
  13. log.info(consumer);
  14. });
  15. log.info("doing something else");
  16. }

理想情况下像前面的例子 “做其他事情”必须立即打印。 但无论我做什么,打印所有元素都需要 10 秒,然后打印“做其他事情”。输出如下:

  1. i am here
  2. consuming
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. doing something else

谁能解释一下我在这里遗漏了什么?

解决方法

我觉得我需要从警告开始 - 这肯定不是如何使用 Webflux。任何时候你调用 subscribe ,你几乎肯定做错了 - 这应该留给框架。相反,您应该使用:

  • doOnNext() 用于记录日志等副作用;
  • delayElements() 如果你想延迟 Flux 中的每个元素,而不是使用 Thread.sleep();
  • 从您的 Flux 方法返回您的 doSomething()(或返回一些通过使用运算符链接您的 Flux 创建的发布者),以允许框架订阅并因此执行您的反应式链。

如果您遵循上述“正常”的做事方式,您可能不会遇到阻塞/线程导致意外问题的这类问题。如果你做更多的小众事情,比如自己订阅、阻止线程而不考虑是否应该阻止它们等等 - 那么你可能会给自己带来很多问题。

但是,要直接回答为什么会发生这种行为的问题 - 这是因为线程。当您使用 Flux.just() 时,您使用的是立即调度程序(这意味着首先实际执行您的 doSomething() 方法的线程相同。)由于这里只有一个线程在运行,因此您的 subscribe 方法阻塞这个线程直到它完成,所以没有其他东西可以执行。例如,如果您告诉您的 FluxboundedElastic() 线程池上发布,例如这样,您会发现它的行为符合您的预期:

  1. Flux<Integer> f = Flux.just(1,2,3,4,5).subscribeOn(Schedulers.boundedElastic());

在您的另一个示例中,当您使用 WebClient 时,它会在与执行您的方法的线程不同的线程上发布 - 因此在订阅者中阻止这个不同的线程不会阻止您的 doSomething() 方法的整体执行.

Flux.mergeOrdered() 不对 Flux 进行排序

Flux.mergeOrdered() 不对 Flux 进行排序

如何解决Flux.mergeOrdered() 不对 Flux 进行排序

我对 Flux.mergeOrdered() 方法有问题。我有一个班级

  1. static class Person {
  2. int age;
  3. String name;
  4. public Person(int age,String name) {
  5. this.age = age;
  6. this.name = name;
  7. }
  8. //getters and setters
  9. @Override
  10. public boolean equals(Object o) {
  11. if (this == o) return true;
  12. if (o == null || getClass() != o.getClass()) return false;
  13. Person person = (Person) o;
  14. return age == person.age && Objects.equals(name,person.name);
  15. }
  16. @Override
  17. public int hashCode() {
  18. return Objects.hash(age,name);
  19. }
  20. //toString()
  21. }

现在我尝试创建一些 Person,将它们放在不同的 Fluxes 中,创建比较器并使用 Flux.mergeOrdered() 方法获得一个有序的 Flux:

  1. Person alex = new Person(13,"Alex");
  2. Person misha = new Person(12,"Misha");
  3. Person oleg = new Person(14,"Oleg");
  4. Person nikita = new Person(66,"Nikita");
  5. Person dima = new Person(60,"Dima");
  6. Person kolya = new Person(68,"Kolya");
  7. Flux<Person> young = Flux.just(alex,misha,oleg);
  8. Flux<Person> old = Flux.just(nikita,dima,kolya);
  9. Comparator<Person> personComparator = Comparator.comparingInt(Person::getAge);
  10. Flux.mergeOrdered(personComparator,young,old).subscribe(System.out::println);

我的输出:

人{age=13,name=''Alex''} 人{age=12,name=''Misha''} 人{age=14,name=''Oleg''} 人{age=66,name=''Nikita''} 人{age=60,name=''Dima''} 人{age=68,name=''Kolya''}

为什么结果 Flux 不是 Ordered?

我们今天的关于react-native-router-flux popTo('想pop到的scene') 回退多级不能实现问题react回退保持页面状态的分享已经告一段落,感谢您的关注,如果您想了解更多关于./node_modules/react-router-dom/react-router-dom.js尝试导入错误:未从“ react-router”导出“ Navigate”、Flux v2 是 Argo Flux 的替代品、Flux 在 Webclient 和简单的 Flux.just 中表现不同、Flux.mergeOrdered() 不对 Flux 进行排序的相关信息,请在本站查询。

本文标签: