Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.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
Javascript React-Redux:mapStateToProps内的逻辑不会导致重新渲染_Javascript_Reactjs_Typescript_Redux_React Redux - Fatal编程技术网

Javascript React-Redux:mapStateToProps内的逻辑不会导致重新渲染

Javascript React-Redux:mapStateToProps内的逻辑不会导致重新渲染,javascript,reactjs,typescript,redux,react-redux,Javascript,Reactjs,Typescript,Redux,React Redux,我想知道我在react-redux的mapstatetrops模式中看到的这种行为背后的“原因”。我没有把我所有的减缩,行动等放在我的问题中,因为我不认为这些是问题所在 video.component.tsx const-mapStateToProps=(状态:RootState)=>({ //有效的activeVideoState为:“预加入”|“活动” 预连接:state.video.activeVideoState==='prejoin', }); 类_VideoComponent扩展了R

我想知道我在
react-redux
mapstatetrops
模式中看到的这种行为背后的“原因”。我没有把我所有的减缩,行动等放在我的问题中,因为我不认为这些是问题所在

video.component.tsx

const-mapStateToProps=(状态:RootState)=>({
//有效的activeVideoState为:“预加入”|“活动”
预连接:state.video.activeVideoState==='prejoin',
});
类_VideoComponent扩展了React.Component{
组件安装(){
this.checkJoinState();
}
组件将更新(){
this.checkJoinState();
}
异步checkJoinState(){
如果(!this.props.prejoin){
//做事
}
}
//文件类的其余部分
}
//'withRouter()'不应影响任何内容
导出常量VideoComponent=带路由器(连接(
MapStateTops,
无效的
)(视频组件),;
下面是我的reducer的一个片段(只是为了确保我只使用副本,而不改变我的状态):

video.reducer.ts


常量初始状态={
activeVideoState:“预加入”,
};
导出常量videoReducer=(状态=初始状态,操作)=>{
开关(动作类型){
案例视频已启动:{
返回{…状态,activeVideoState:'active'};
}
//其他情况
} 
返回状态;
}
video.actions.ts

export const sessionstart=(sessionId:string)=>({
类型:视频已启动,
会话ID
});
服务.ts

从'@store/store'导入{store};
//rxjs observable可监听WS以启动视频
这个.onVideoStarted()
.订阅((会话)=>{
//代码
dispatch(sessionStarted(session.id));
});
当组件最初呈现时,
state.video.activeVideoState==='prejoin'
始终为
true
。但在组件的整个生命周期内,
state.video.activeVideoState
将更改为
active
。按照此组件的设置方式,
VideoComponent
永远不会重新渲染,即使我可以清楚地看到redux状态已更改(使用react redux浏览器扩展)

但是,如果我将函数更改为如下所示:

const-mapStateToProps=(状态:RootState)=>({
//有效的activeVideoState为:“预加入”|“活动”
预连接:state.video.activeVideoState==='prejoin',
_我不使用这个:state.video.activeVideoState
});

然后,我的组件将更新并重新渲染。我只是好奇为什么会这样。我非常了解redux模式,但不知道其内部结构。我看到有一些您可以传递到
connect()
。也许
arestatequal()
函数查看的是引用而不是值

对于
redux
来说,这似乎根本不是问题。我只是碰巧注意到我使用了错误的组件挂钩。当我切换它们时,我的组件开始重新渲染。我无法让错误行为在回购协议中起作用:

更改:

//已弃用
componentWillUpdate(){}
//对此
componentDidUpdate(){}

我不知道为什么会有不同,但确实如此

你能显示你发送视频的代码吗?我把它们添加为VIDEO.actions.ts和service.ts为什么会话开始了?在你的减速机中,你使用了视频?很难帮助你从代码中看到更多。你能在Codesandbox上创建一个最小的例子吗?您可以使用以下内容作为起点什么是
@store/store
?但是如果它是创建的存储,那么分派应该像分派它一样工作。刚刚启动的
会话
与您启动的还原器操作类型
视频
不匹配。使用
store.dispatch()
,因此将
connect()
方法与
mapstatetrops()
一起使用将是首选选项。从服务调用
store.dispath()
是否是反模式?这就是我现在使用它的方式(从
service.ts
调用它)。我有一些服务可以管理Singleton和其他第三方LIB,它们不能也不应该由redux管理。