redux-form初始值异常:_.pick输出正常但表单未加载对应值
看起来你遇到的问题是redux-form没有正确加载你通过_.pick获取的初始值——控制台能打印出正确结果,但表单就是不显示这些值。我之前也碰到过类似的情况,大概率是这几个原因导致的,给你几个针对性的解决方案:
1. 开启enableReinitialize核心配置
redux-form默认只会在组件第一次挂载时加载initialValues,之后即使initialValues更新了,表单也不会自动重新渲染。你需要在StreamForm的redux-form装饰器里加上enableReinitialize: true,这样当initialValues变化时,表单会重新加载新的值。
修改你的StreamForm组件的redux-form配置:
import { reduxForm } from 'redux-form'; class StreamForm extends Component { // 你的组件原有代码... } export default reduxForm({ form: 'streamForm', // 这里的form名称要和你的实际配置一致 enableReinitialize: true // 关键:开启重新初始化开关 })(StreamForm);
2. 确保stream数据已完全加载
如果this.props.stream是通过异步请求获取的(比如从后端API拉取),组件第一次render时stream可能还没返回,此时initialValues会是一个空对象。等stream数据到了之后,即使initialValues更新了,没开enableReinitialize的话表单也不会同步更新。
你可以在父组件里先判断stream是否存在,再渲染表单,避免传递空的initialValues:
render(){ const { stream } = this.props; // 等待stream数据加载完成,避免传递空值 if (!stream) { return <div>Loading stream...</div>; } const initialValues = _.pick(stream,'title','description'); console.log(initialValues); return( <div> <h3>Edit Stream</h3> <StreamForm initialValues={initialValues} onSubmit={this.onSubmit} /> </div> ) }
3. 核对Field组件的name属性
虽然你的代码里title和description看起来是匹配的,但还是要确认Field的name属性和initialValues的键完全一致(大小写、拼写都不能错)。比如如果initialValues里是Title而Field用的是title,就会出现加载失败的情况。
4. 直接在redux-form配置中注入initialValues(可选)
如果你不想通过props传递initialValues,也可以直接在reduxForm的配置里通过mapStateToProps注入,这样更贴合redux的数据流逻辑:
import { reduxForm } from 'redux-form'; import { connect } from 'react-redux'; class StreamForm extends Component { // 你的组件原有代码... } const mapStateToProps = (state, ownProps) => { // 根据你的redux state结构调整获取stream的方式 const stream = state.streams[ownProps.streamId]; return { initialValues: stream ? _.pick(stream, 'title', 'description') : {} }; }; export default connect(mapStateToProps)( reduxForm({ form: 'streamForm', enableReinitialize: true })(StreamForm) );
按照上面的方法调整后,应该就能让redux-form正确加载初始值了。
内容的提问来源于stack exchange,提问作者Athul Narayanan

