最近很多小伙伴都在问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回退保持页面状态)
- ./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版本是
"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(){
}
./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=?>
行。
解决方法
为什么只安装两个都需要,这可以工作
- 执行npm删除react-router
- 删除node_modules
- 纱线安装或npm安装和
- 启动纱线或启动npm
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 中表现不同
我在 Spring 中有基本的 rest 控制器。为了试用 spring webflux 并了解它的非阻塞性质。我创建了两个控制器映射,一个用于读取,另一个用于为 webclient 调用提供服务(如下所示)
@GetMapping("/slow-service-tweets")
private List<String> getAllTweets() {
try {
Thread.sleep(2000L); // delay
} catch (InterruptedException e) {
e.printstacktrace();
}
return Arrays.asList(
"Item1","Item2","Item3");
}
这是我的测试 get api,它只会触发下面给出的代码(第一个版本)
@GetMapping("/test")
public void doSomething(){
log.info("Starting NON-BLOCKING Controller!");
Flux<String> tweetFlux = WebClient.create()
.get()
.uri("http://localhost:9090/slow-service-tweets")
.retrieve()
.bodyToFlux(String.class);
tweetFlux.subscribe(tweet ->{
try {
log.info("i am back");
Thread.sleep(6000L);
} catch (InterruptedException e) {
e.printstacktrace();
}
log.info(tweet.toString());});
log.info("Exiting NON-BLOCKING Controller!");
上面的代码完全按照它应该的方式运行。输出是
Starting NON-BLOCKING Controller!
Exiting NON-BLOCKING Controller!
Item1
Item2
Item3
原因是线程在订阅通量时不会阻塞并继续前进。 现在请看下面的第二个版本。
@GetMapping("/test")
public void doSomething(){
System.out.println("i am here");
Flux<Integer> f= Flux.just(1,2,3,4,5);
// Flux<Integer> f= Flux.fromIterable(testService.returnStaticList());
f.subscribe(consumer->{
try {
log.info("consuming");
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printstacktrace();
}
log.info(consumer);
});
log.info("doing something else");
}
理想情况下像前面的例子 “做其他事情”必须立即打印。 但无论我做什么,打印所有元素都需要 10 秒,然后打印“做其他事情”。输出如下:
i am here
consuming
1
2
3
4
5
doing something else
谁能解释一下我在这里遗漏了什么?
解决方法
我觉得我需要从警告开始 - 这肯定不是如何使用 Webflux。任何时候你调用 subscribe ,你几乎肯定做错了 - 这应该留给框架。相反,您应该使用:
-
doOnNext()
用于记录日志等副作用; -
delayElements()
如果你想延迟 Flux 中的每个元素,而不是使用 Thread.sleep(); -
从您的
Flux
方法返回您的doSomething()
(或返回一些通过使用运算符链接您的 Flux 创建的发布者),以允许框架订阅并因此执行您的反应式链。
如果您遵循上述“正常”的做事方式,您可能不会遇到阻塞/线程导致意外问题的这类问题。如果你做更多的小众事情,比如自己订阅、阻止线程而不考虑是否应该阻止它们等等 - 那么你可能会给自己带来很多问题。
但是,要直接回答为什么会发生这种行为的问题 - 这是因为线程。当您使用 Flux.just()
时,您使用的是立即调度程序(这意味着首先实际执行您的 doSomething()
方法的线程相同。)由于这里只有一个线程在运行,因此您的 subscribe 方法阻塞这个线程直到它完成,所以没有其他东西可以执行。例如,如果您告诉您的 Flux
在 boundedElastic()
线程池上发布,例如这样,您会发现它的行为符合您的预期:
Flux<Integer> f = Flux.just(1,2,3,4,5).subscribeOn(Schedulers.boundedElastic());
在您的另一个示例中,当您使用 WebClient 时,它会在与执行您的方法的线程不同的线程上发布 - 因此在订阅者中阻止这个不同的线程不会阻止您的 doSomething()
方法的整体执行.
Flux.mergeOrdered() 不对 Flux 进行排序
如何解决Flux.mergeOrdered() 不对 Flux 进行排序
我对 Flux.mergeOrdered() 方法有问题。我有一个班级人:
static class Person {
int age;
String name;
public Person(int age,String name) {
this.age = age;
this.name = name;
}
//getters and setters
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name,person.name);
}
@Override
public int hashCode() {
return Objects.hash(age,name);
}
//toString()
}
现在我尝试创建一些 Person,将它们放在不同的 Fluxes 中,创建比较器并使用 Flux.mergeOrdered() 方法获得一个有序的 Flux:
Person alex = new Person(13,"Alex");
Person misha = new Person(12,"Misha");
Person oleg = new Person(14,"Oleg");
Person nikita = new Person(66,"Nikita");
Person dima = new Person(60,"Dima");
Person kolya = new Person(68,"Kolya");
Flux<Person> young = Flux.just(alex,misha,oleg);
Flux<Person> old = Flux.just(nikita,dima,kolya);
Comparator<Person> personComparator = Comparator.comparingInt(Person::getAge);
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 进行排序的相关信息,请在本站查询。
本文标签: