能否无参数传递mapStateToProps?Redux connect绑定疑问
你的Redux connect优化思路:注意这个关键坑!
嘿,你的简化思路本身没问题,但不管是你原来的写法,还是你想改成的写法,都存在一个容易踩的坑——你在模块加载阶段就直接调用了store.getState(),这个formdata变量是静态的,只会在组件文件被导入时计算一次,之后哪怕Redux store里的表单数据更新了,它也不会跟着变。这就失去了Redux connect的核心作用:让组件响应store状态的变化。
先说说原有写法的问题
你原来的代码里:
const formdata = store.getSate().form.myReduxForm.values const mapStateToProps = formData ? ({ form }) => ({ formData: form.myReduxForm.values, }) : null
这里的formdata是在文件刚加载时就取到的初始值,之后store更新它也不会变。而且你在mapStateToProps里又重新从state里拿了一次数据,确实显得冗余,但更关键的是模块级直接取state的行为本身就不符合Redux的使用规范。
正确的优化写法
你真正需要做的是把状态判断逻辑放到mapStateToProps内部,让它在每次store更新时都能拿到最新的状态切片,同时写法也更简洁:
import { connect } from 'react-redux' import MyForm from '~/MyForm' const mapStateToProps = (state) => { // 可选链操作符避免不存在的属性报错 const formData = state.form?.myReduxForm?.values; // 只有当formData存在时才返回这个props,否则返回null(connect会处理空值) return formData ? { formData } : null; } export default connect(mapStateToProps)(MyForm)
这么做的好处:
- 每次store状态更新,
mapStateToProps都会被调用,拿到最新的表单数据 - 避免了模块加载时直接访问store的静态取值问题,保证组件能实时响应状态变化
- 写法简洁,没有冗余的重复取值
关于你想改的写法的补充
如果你坚持想用类似的简化写法,必须保证formdata是动态获取的,但模块级变量做不到这一点。不过就算改成下面这样,其实和上面的标准写法效果一样,反而多了一层嵌套,没必要:
const mapStateToProps = (state) => { const formData = state.form?.myReduxForm?.values; return formData ? () => ({ formData }) : null; }
总结一下:别在模块加载阶段直接调用store.getState(),把状态的获取和判断都放到mapStateToProps内部,这样既符合Redux的使用规范,又能达到你想要的“仅当状态切片可用时才传递props”的需求,写法也更简洁合理。
内容的提问来源于stack exchange,提问作者Fatah
相关产品推荐
相关产品推荐

