Javascript 连接的组件从Redux存储读取,但操作创建者不读取';我不能更新它

Javascript 连接的组件从Redux存储读取,但操作创建者不读取';我不能更新它,javascript,reactjs,redux,react-redux,redux-toolkit,Javascript,Reactjs,Redux,React Redux,Redux Toolkit,我有一个连接的组件,它从Redux商店获取信息并显示在屏幕上。但每当我尝试发送一个操作来更新状态时,它都不会做任何事情: AppSettings.js 导入{ 分钟, 分钟, }来自“../constants” 进口{ 递减, 增量会话, }来自“/timerSlice” 从“React”导入React 从“react redux”导入{connect} 从“快速深度相等”导入相等 /*eslint禁用没有无用的构造函数*/ 导出类AppSettings扩展React.Component{ 建造

我有一个连接的组件,它从Redux商店获取信息并显示在屏幕上。但每当我尝试发送一个操作来更新状态时,它都不会做任何事情:

AppSettings.js

导入{
分钟,
分钟,
}来自“../constants”
进口{
递减,
增量会话,
}来自“/timerSlice”
从“React”导入React
从“react redux”导入{connect}
从“快速深度相等”导入相等
/*eslint禁用没有无用的构造函数*/
导出类AppSettings扩展React.Component{
建造师(道具){
超级(道具)
此.state={
sessionLength:this.props.sessionLength,
}
}
componentDidUpdate(prevProps){
如果(!等于(this.props,prevProps)){
this.setState((u,props)=>{
返回{
会话长度:props.sessionLength,
};
})
}
}
render(){
让sessionLength=Math.floor(this.props.sessionLength/MINUTE\u MS)%MINUTE\u
sessionLength=('0'+sessionLength).slice(-2)
返回(
一场
向上的
{会话长度}
向下
);
}
}
函数MapStateTops(状态){
返回{
会话长度:状态['sessionLength'],
};
}
函数mapDispatchToProps(){
返回{
递减,
增量会话,
};
}
导出默认连接(
MapStateTops,
mapDispatchToProps,
)(应用程序设置)
timerSlice.js

导入{
默认会话,
分钟,
}来自“../constants”
从“@reduxjs/toolkit”导入{createSlice}
export const timerSlice=createSlice({
名称:“计时器”,
初始状态:{
会话长度:默认会话,
},
减速器:{
递减(状态){
状态['sessionLength']-=分钟
},
增量会话(状态){
状态['sessionLength']+=分钟
},
}
})
出口常数{
递减,
增量会话,
}=timerSlice.actions
导出默认timerSlice.reducer
store.js

从'@reduxjs/toolkit'导入{configureStore}
从“../features/timerSlice”导入减速机
常量存储=配置存储({
减速器:减速器
})
导出默认存储
在初始渲染时,该组件从存储中读取数据,并显示适当的值。单元测试表明,当组件通过新道具时,它会更新屏幕上呈现的值。我的单元测试还显示,只要按下按钮,就会调用相应的函数。我在浏览器中运行了我的应用程序,结果显示Redux商店根本没有更新


为什么每次我尝试从我的组件分派操作时,我的应用商店都没有响应?

当前设置中的
mapDispatchToProps
似乎有问题。我通过将其转换为函数组件并使用
useDispatch
调用操作使其工作

地方政府是不必要的。只需直接使用从redux中选择的值

export const AppSettings = () => {

  const dispatch = useDispatch();

  const sessionLength = useSelector(state => state.sessionLength);

  const seconds = Math.floor(sessionLength / MINUTE_MS) % MINUTE_S
  const secondsString = ('0' + seconds).slice(-2)
  
  return (
    <div>
      <div>
        <h3>
          session
        </h3>
        <button 
          id='sessionUp'
          onClick={() => dispatch(incrementSession())}
          >
          up
        </button>
        <h4>
          {secondsString}
        </h4>
        <button 
          id='sessionDown'
          onClick={() => dispatch(decrementSession())}
          >
          down
        </button>
      </div>
    </div>
  );
}
export const AppSettings=()=>{
const dispatch=usedpatch();
const sessionLength=useSelector(state=>state.sessionLength);
常数秒=数学楼层(课时长度/分钟)%分钟
常量secondsString=('0'+秒).slice(-2)
返回(
一场
分派(incrementSession())}
>
向上的
{secondsString}
分派(递减())}
>
向下
);
}

是否安装了redux devtools(浏览器扩展)?您能否验证您的存储至少正在注册已调度的操作?顺便说一句,它可以方便地让您直接从开发工具发送操作。如果您看到已记录的操作,请检查操作负载(如果有),状态差异@DrewReese表明存储区没有注册已发送的操作。当我使用redux devtools手动分派类型为
timer/incrementSession
的操作时,它会注册更改,但在我单击应用程序上的任何按钮时不会注册。在这种情况下,你有什么建议?它应该使用对象速记符号。我能想到的唯一一种情况是对象速记会失败,即存在循环导入,并且
递增会话
递减会话
在初始运行时是
未定义的
,只有在以后才可用。因此,寻找循环导入可能有助于找到根本问题。@phry我认为循环导入也不是问题所在。当我刚刚停止使用
mapDispatchToProps
并使用连接组件默认的
this.props.dispatch()
方法时,它在
incrementSession
decrementSession
@phry中运行良好,我开始使用mapDispatchToProps在同一文件中处理所有内容。我真的不知道为什么它不起作用,因为我觉得它很合适。但我可以确认它不起作用。@jaime不会反对循环依赖。具有循环依赖关系的一点是,循环导入的内容可能在初始代码求值时(定义
MapStateTrops
对象时)是
未定义的
,但以后可以引用,例如在组件的方法调用中。但按照@LindaPaiste所说的,可能不是这样。神秘!