React+Redux示例中mapStateToProps未触发问题求助
兄弟,我看你遇到的情况是请求已经到reducer处理完成,但容器组件的mapStateToProps完全没被调用对吧?这问题我之前踩过好几个坑,给你捋几个最可能的原因和解决办法:
别在组件内部单独创建store实例!
看你代码里写了const store = configureStore(),但connect是通过React上下文获取<Provider>传递的全局store的。如果你组件没被包裹在<Provider store={store}>里,或者你这里创建的store和全局用的不是同一个,那状态更新根本传不到组件里。
正确的做法是:在项目入口文件(比如index.js)创建store,然后用<Provider>把整个应用包裹起来,容器组件只需要通过connect连接,不用自己创建store。检查reducer是否返回了新的状态对象
Redux是通过浅比较判断状态是否变化的,如果你的reducer直接修改原state(比如state.caseTypes = action.payload),而不是返回新对象(return {...state, caseTypes: action.payload}),Redux会认为状态没变化,自然不会触发mapStateToProps更新。
记住:reducer必须是纯函数,绝对不能修改原状态,必须返回新的引用。确认mapStateToProps的状态路径是否正确
你会不会在mapStateToProps里取错了state的属性?比如你的caseTypes存在state.case.caseTypes,但你写成了state.caseTypes,那即使状态更新了,组件也拿不到新值,mapStateToProps就算被调用也没用(甚至可能因为没变化不触发)。可以在mapStateToProps里加个console.log(state)看看实际的状态结构。检查connect的用法是否正确
有没有把mapStateToProps和mapDispatchToProps的顺序搞反?connect的第一个参数是mapStateToProps,第二个是mapDispatchToProps,最后才是要包裹的组件。顺序错了也会导致状态连接失效。
给你个修正后的容器组件示例:
import React from 'react'; import { loadCaseTypes } from '../../actions/caseAction'; import { connect } from 'react-redux'; import CaseSearchComponent from './CaseSearchComponent'; // 定义mapStateToProps,先打印状态确认结构 const mapStateToProps = (state) => { console.log('当前全局状态:', state); return { caseTypes: state.case.caseTypes // 这里要对应你的reducer合并后的路径 }; }; // 映射dispatch方法 const mapDispatchToProps = { loadCaseTypes }; // 正确连接组件 const CaseSearchContainer = connect( mapStateToProps, mapDispatchToProps )(CaseSearchComponent); export default CaseSearchContainer;
然后入口文件的正确写法:
import React from 'react'; import ReactDOM from 'react-dom'; import { Provider } from 'react-redux'; import configureStore from './store/configureStore'; import CaseSearchContainer from './containers/CaseSearchContainer'; // 全局唯一的store实例 const store = configureStore(); ReactDOM.render( <Provider store={store}> <CaseSearchContainer /> </Provider>, document.getElementById('root') );
先从检查store实例是否全局共享开始排查,这个是最常见的坑,然后再看reducer的immutable处理,应该就能解决问题了!
内容的提问来源于stack exchange,提问作者user3113975

