无法使用来自 Axios 的值初始化 redux-form
Cannot initialize redux-form with values comming from Axios
我正在使用 6.7.0 版的 redux-form,一旦 Axios 通过 "fetchPerson" redux 操作成功执行 http get 请求,我就无法初始化我的表单。
我在导出 ReduxForm 时已经设置了 "enableReinitialize : true,",但它仍然没有呈现结果。
(顺便说一句,验证函数也没有被调用)
这是我的减速器的全部代码:
import React, { Component } from 'react';
import { Field, reduxForm } from 'redux-form';
import { fetchPerson, editPerson } from '../actions';
import { connect } from 'react-redux';
import { Link} from 'react-router-dom';
import 'react-table/react-table.css';
class EditPerson extends Component {
componentDidMount() {
const { id } = this.props.match.params;
this.props.fetchPerson(id);
}
renderField(field) {
const { meta: { touched, error } } = field;
const className = `form-group ${touched && error ? 'has-danger' : ''}`;
return (
<div className={className}>
<label>{field.label}</label>
<input
className="form-control"
type="text"
{...field.input}
/>
<div className="text-help">
{touched ? error : ''}
</div>
</div>
);
}
onSubmit(values) {
const { id } = this.props.match.params;
this.props.editPerson(id,values, () => {
this.props.history.push('/personas');
});
}
render() {
const { handleSubmit } = this.props;
const { person } = this.props;
if (!person) {
return <div>Loading...</div>;
}
console.log("this.props");
console.log(this.props);
return (
<div className="row">
<div className="col-lg-12">
<div className="row wrapper border-bottom white-bg page-heading">
<div className="col-lg-10">
<h2>Editar Persona {person.name}</h2>
<ol className="breadcrumb">
<li>
<a href="index.html">Home</a>
</li>
<li>
<a href="personas/">Personas</a>
</li>
<li className="active">
<strong>Editar Persona :{person.name}</strong>
</li>
</ol>
</div>
</div>
</div>
<div className="wrapper wrapper-content animated fadeInRight">
<div className="row">
<div className="col-lg-6">
<div className="row">
<div className="col-lg-12">
<div className="well" style={{background: 'white'}}>
<h3>Datos</h3>
<form onSubmit={handleSubmit(this.onSubmit.bind(this))}>
<Field
label="Nombre"
name="name"
component={this.renderField}
/>
<Field
label="Email"
name="email"
component={this.renderField}
/>
<Field
label="Telefono"
name="tel"
component={this.renderField}
/>
<button type="submit" className="btn btn-primary">Submit</button>
<Link to="/personas" className="btn btn-danger">Cancel</Link>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
)
}
}
function validate(values) {
// console.log(values) -> { title: 'asdf', categories: 'asdf', content: 'asdf' }
const errors = {};
// Validate the inputs from 'values'
if (!values.name) {
errors.title = "Enter a name";
}
if (!values.email) {
errors.categories = 'Enter some email';
}
if (!values.tel) {
errors.content = 'Enter some content telefono';
}
return errors;
}
function mapStateToProps(state) {
console.log("state mapStateToProps");
console.log(state);
return {
person: state.personas.person,
initialValues:state.personas.person,
}
};
export default reduxForm({
enableReinitialize : true,
form: 'PersonEditForm'
})(
connect(mapStateToProps,{ editPerson, fetchPerson })(EditPerson)
);
这是我的浏览器控制台,其中 personas.person 它是在第二行创建的:
redux 表单文档显示了用 reduxForm 函数修饰的组件,然后是连接函数。试着把它分解成类似的东西:
EditPerson = reduxForm({
...
})(EditPerson)
export default connect(mapStateToProps, { ... })(EditPerson)
另请注意,这些值只会被初始化一次。如果需要,您可以简单地将 initialValues 对象从上方传递到表单,并从库中调度初始化操作以重新填充初始值。
我正在使用 6.7.0 版的 redux-form,一旦 Axios 通过 "fetchPerson" redux 操作成功执行 http get 请求,我就无法初始化我的表单。 我在导出 ReduxForm 时已经设置了 "enableReinitialize : true,",但它仍然没有呈现结果。 (顺便说一句,验证函数也没有被调用)
这是我的减速器的全部代码:
import React, { Component } from 'react';
import { Field, reduxForm } from 'redux-form';
import { fetchPerson, editPerson } from '../actions';
import { connect } from 'react-redux';
import { Link} from 'react-router-dom';
import 'react-table/react-table.css';
class EditPerson extends Component {
componentDidMount() {
const { id } = this.props.match.params;
this.props.fetchPerson(id);
}
renderField(field) {
const { meta: { touched, error } } = field;
const className = `form-group ${touched && error ? 'has-danger' : ''}`;
return (
<div className={className}>
<label>{field.label}</label>
<input
className="form-control"
type="text"
{...field.input}
/>
<div className="text-help">
{touched ? error : ''}
</div>
</div>
);
}
onSubmit(values) {
const { id } = this.props.match.params;
this.props.editPerson(id,values, () => {
this.props.history.push('/personas');
});
}
render() {
const { handleSubmit } = this.props;
const { person } = this.props;
if (!person) {
return <div>Loading...</div>;
}
console.log("this.props");
console.log(this.props);
return (
<div className="row">
<div className="col-lg-12">
<div className="row wrapper border-bottom white-bg page-heading">
<div className="col-lg-10">
<h2>Editar Persona {person.name}</h2>
<ol className="breadcrumb">
<li>
<a href="index.html">Home</a>
</li>
<li>
<a href="personas/">Personas</a>
</li>
<li className="active">
<strong>Editar Persona :{person.name}</strong>
</li>
</ol>
</div>
</div>
</div>
<div className="wrapper wrapper-content animated fadeInRight">
<div className="row">
<div className="col-lg-6">
<div className="row">
<div className="col-lg-12">
<div className="well" style={{background: 'white'}}>
<h3>Datos</h3>
<form onSubmit={handleSubmit(this.onSubmit.bind(this))}>
<Field
label="Nombre"
name="name"
component={this.renderField}
/>
<Field
label="Email"
name="email"
component={this.renderField}
/>
<Field
label="Telefono"
name="tel"
component={this.renderField}
/>
<button type="submit" className="btn btn-primary">Submit</button>
<Link to="/personas" className="btn btn-danger">Cancel</Link>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
)
}
}
function validate(values) {
// console.log(values) -> { title: 'asdf', categories: 'asdf', content: 'asdf' }
const errors = {};
// Validate the inputs from 'values'
if (!values.name) {
errors.title = "Enter a name";
}
if (!values.email) {
errors.categories = 'Enter some email';
}
if (!values.tel) {
errors.content = 'Enter some content telefono';
}
return errors;
}
function mapStateToProps(state) {
console.log("state mapStateToProps");
console.log(state);
return {
person: state.personas.person,
initialValues:state.personas.person,
}
};
export default reduxForm({
enableReinitialize : true,
form: 'PersonEditForm'
})(
connect(mapStateToProps,{ editPerson, fetchPerson })(EditPerson)
);
这是我的浏览器控制台,其中 personas.person 它是在第二行创建的:
redux 表单文档显示了用 reduxForm 函数修饰的组件,然后是连接函数。试着把它分解成类似的东西:
EditPerson = reduxForm({
...
})(EditPerson)
export default connect(mapStateToProps, { ... })(EditPerson)
另请注意,这些值只会被初始化一次。如果需要,您可以简单地将 initialValues 对象从上方传递到表单,并从库中调度初始化操作以重新填充初始值。