Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs RxJS和重复事件_Reactjs_Typescript_Rxjs - Fatal编程技术网

Reactjs RxJS和重复事件

Reactjs RxJS和重复事件,reactjs,typescript,rxjs,Reactjs,Typescript,Rxjs,一般来说,我不熟悉RxJs,但我正在调查某个React代码中的一个bug,在该代码中,在一个不相关的操作中,一个旧事件似乎被发出并呈现为一个显示错误。试想一下,如果您有两个按钮在屏幕上的某个位置生成了两条消息,单击一个按钮会显示另一个按钮的消息 作为RxJs的新手,我不确定问题出在哪里。我在代码中没有看到一个ReplaySubject,只有可观察的s、主题s和行为主题s。这要么是RxJs特性的误用,要么就是某个地方的错误逻辑 无论如何,我找到了相关的可观察的代码,我不太确定这个人想在这里完成什么

一般来说,我不熟悉RxJs,但我正在调查某个React代码中的一个bug,在该代码中,在一个不相关的操作中,一个旧事件似乎被发出并呈现为一个显示错误。试想一下,如果您有两个按钮在屏幕上的某个位置生成了两条消息,单击一个按钮会显示另一个按钮的消息

作为RxJs的新手,我不确定问题出在哪里。我在代码中没有看到一个
ReplaySubject
,只有
可观察的
s、
主题
s和
行为主题
s。这要么是RxJs特性的误用,要么就是某个地方的错误逻辑

无论如何,我找到了相关的
可观察的代码,我不太确定这个人想在这里完成什么。我已经阅读了
combinelatetest
map
pipe
,但这对我来说似乎是毫无意义的代码。它是否也会以某种方式重现旧事?我在任何地方都看不到动态订阅,尤其是在这种情况下

Tldr我不明白这个代码的意图

export interface IFeedback {
  id: number
  text: string
}

export interface IFeedbackMessages {
  message: IFeedback | undefined
}

feedback$ = new BehaviorSubject<IFeedback | undefined>(undefined)

feedbackNotifs$: Observable<IFeedbackMessages> = combineLatest([
  feedback$
]).pipe(
  map(([feedback]) => ({
    feedback
  })
))
导出接口IFeedback{
身份证号码
文本:字符串
}
导出接口IFeedbackMessages{
消息:IFeedback |未定义
}
反馈$=新行为主体(未定义)
反馈通知$:可观察=组合测试([
回馈$
]).烟斗(
映射(([反馈])=>({
反馈
})
))

我也发现这可能是个问题。在显示此消息的React组件中,我是否错了,但每次此内容呈现订阅然后取消订阅上述主题时,它是否看起来都是这样

const FeedbackDisplay: React.FC () => {
   
  const [feedbackNotifications, setFeedbackNotifications] = React.useState<IFeedbackMessages>()
  React.useEffect(() =>
  {
    const sub = notification$.subscribe(setFeedbackNotifications)
    return () => sub?.unsubscribe()
  }, [notifications$])

}
const FeedbackDisplay:React.FC()=>{
const[feedbackNotifications,setFeedbackNotifications]=React.useState()
React.useffect(()=>
{
const sub=通知$.subscribe(设置反馈通知)
return()=>sub?.unsubscribe()
},[notifications$])
}
它是否也会以某种方式重现旧事

是的,可能是
BehaviorSubject
具有一个独特的属性,即在订阅后立即发出最后一个推送到它的值

当您想要对一些持久状态值进行建模时,这是非常好的,而对于实际发生时刻是关键的事件则不太好。听起来你正在处理的反馈信息属于第二类,在这种情况下,
Subject
可能是更好的选择

它看起来像是每次订阅然后取消订阅上面的主题吗

const FeedbackDisplay: React.FC () => {
   
  const [feedbackNotifications, setFeedbackNotifications] = React.useState<IFeedbackMessages>()
  React.useEffect(() =>
  {
    const sub = notification$.subscribe(setFeedbackNotifications)
    return () => sub?.unsubscribe()
  }, [notifications$])

}
不完全是
useffect
接受回调,在该回调中,您可以选择返回“cleanup”函数。React将保留该函数,直到再次触发效果,然后调用它来清理(在本例中包括关闭订阅),为下一个效果腾出空间


因此,在这种情况下,只有当组件呈现为
notifications$
的新值时,才会发生取消订阅。还值得指出的是,notifications$只有在作为道具传递或在组件函数中创建时才会更改。如果它是在函数外部定义的(例如从另一个文件导入),则不需要(事实上也不应该)将其放入
useffect
的依赖项数组中。

通知$
是在此组件顶部创建的,但它是函数调用的结果。该函数返回
notifications$
,这是一个
React.useContext
。我无法理解这意味着什么。为了回答这个问题,它应该被视为可以在过程中改变并触发重新呈现的东西,这意味着它确实属于依赖数组。尽管如此,其余的答案仍然成立。更多关于React的信息。