Redux - 状态正在更新,但 React 组件没有

Posted

技术标签:

【中文标题】Redux - 状态正在更新,但 React 组件没有【英文标题】:Redux - State is updating but React components are not 【发布时间】:2019-03-10 14:54:44 【问题描述】:

Redux/React-Redux 没有通过 mapStateToProps 将状态返回给组件,尽管 reducer 正确触发并组装了正确的状态。我遵循了 Redux 代码,状态似乎流过,但尽管已将其包装在 connect 函数中,但它并没有返回到 React 组件。

以下代码摘录:

index.js(我的应用)

import  Provider, connect  from 'react-redux';
import  store  from './store/index';
import  fetchData, ghostFlag, dropDowned, addAttribute, setSelectedItem  from './actions/docActions';

    ...some code...

    render()

      return(

        <span className = "app-container" id = this.props.sidebar_shown>

          <div className="sidebar" >

    <div className = "add_content_1"> 
                <h2 className="page-add-subheader">Content</h2>
                <TextAddContainer BlogSnapshot = this.props.getSnapshot CurrentEditPageHandle = this.props.CurrentEditPageHandle />
                <SidebarImageContainer CurrentEditPageHandle = this.props.CurrentEditPageHandle  />
              </div>



const mapStateToProps = (state, ownProps)  => 
  console.log("The state is:"+state);
  return state;


const mapDispatchToProps = dispatch => 
  return 
    fetchData: () => dispatch(fetchData (typeVar, snapshot)),

    updateHandle: () => dispatch(updateHandle(handle)),

  


ReactDOM.render(
  <Provider store = store>
  <App />
  </Provider>,

    document.getElementById('root')
);

export default connect(mapStateToProps, mapDispatchToProps)(App);

商店:

import React from 'react';
import applyMiddleware, createStore, combineReducers  from 'redux';
import rootReducer from '../reducers/reducers';

export const store = createStore(
    combineReducers(
        state: rootReducer
    ),
    window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
);

import undoable,  distinctState  from 'redux-undo';

Reducers(确认在 devtools 中工作,但返回的状态没有到达我的组件!):

export const rootReducer = ( state , action) => 

    if(typeof(state) === "undefined")
        state = 0;
    

    switch (action.type)
        case 'SELECTED':
            return Object.assign(, state, 

            )

        case 'DROPDOWN':
            return Object.assign(, state, 

            )
        case 'PAGESNAP':
            if(action.payload)
                return Object.assign(, state, 
                    PagesSnapshot : action.payload  
                )              
            else  return state

        case 'BLOGSNAP':
            if(action.payload)
                return Object.assign(, state, 
                    BlogSnapshot : action.payload   
                )              
            else  return state
        case 'IMAGESNAP':
            if(action.payload)
                return Object.assign(, state, 
                    ImageSnapshot : action.payload  
                )              
            else  return state
        case 'CURRENTEDITPAGE':
            return Object.assign( , state, 
                CurrentEditPageHandle : action.payload
            )

        default:
            return state
    



如您所见,我已经相应地映射了连接函数。这是怎么回事?

【问题讨论】:

【参考方案1】:

存在主要问题是因为您在导出它的同一个文件中引用了&lt;App /&gt;。在它被渲染的时候,你还没有真正将你的应用程序连接到你的商店。您需要 &lt;App /&gt; 本质上是连接版本 (export default connect(mapStateToProps, mapDispatchToProps)(App);)。

解决此问题的最简单方法是将课程移至App.js 并如下调用:

App.js:

class App 
    render() 
       ...
    


const mapStateToProps = (state, ownProps)  => 
  console.log("The state is:"+state);
  return state;


const mapDispatchToProps = dispatch => 
  return 
    fetchData: () => dispatch(fetchData (typeVar, snapshot)),

    updateHandle: () => dispatch(updateHandle(handle)),

  


export default connect(mapStateToProps, mapDispatchToProps)(App);

index.js:

import App from './app'
...Setup store...

ReactDOM.render(
 <Provider store = store>
    <App />
 </Provider>,

 document.getElementById('root')
);

【讨论】:

嗯...这是很好的建议,但似乎并没有解决问题。正如您提到的,我已经对其进行了重构,并在 index.js 文件中设置了存储,但更新后的状态似乎仍未到达应用程序,尽管控制台确认状态已更新。只是为了确定——我应该能够从 App 组件中以 props 的形式访问状态,对吧?因此名称为“mapStateToProps”? @camelCaseCowboy 你能创建一个codesandbox 来展示你的问题吗? @camelCaseCowboy 你确定你正在渲染从connect() 返回的组件,而不是ReactDOM.render() 中的&lt;App/&gt; 组件吗? 我在这里做了一个示例代码框:codesandbox.io/s/w0xlllq62k。要回答您的问题 vhflat- 我已将导出的 App React 组件包装在连接函数中,现在将其导入 index.js,其中包含根据 FrankerZ 的说明的 ReactDOM 方法。您指的是“提供者”组件吗?因为我确保将应用程序包装在索引文件中... OP 也有一个 store 问题(他完全创建了另一个 store,并在他的 dispatch 函数中使用它),所以更新没有被转换为 prop 更改,因为他更新了错误的 redux商店。

以上是关于Redux - 状态正在更新,但 React 组件没有的主要内容,如果未能解决你的问题,请参考以下文章

当 redux 状态更新时,React 组件不更新

React/Redux 存储更新但组件未重新渲染

从提交处理函数内部更新 react/redux 状态

React:Redux状态在一个效果中更新但在同一组件中的下一个效果是使用先前的state值

动作调度不更新 Redux/React 中的状态

REACT + REDUX:在 redux 状态更改时 mapStateToProps 更新状态,但视图未按照新状态呈现