2016-10-30 3 views
0

Я пытаюсь создать компонент React, способный создавать или редактировать существующий элемент в моей базе данных. Все работает нормально, кроме одного: когда я вызываю маршрут new с маршрута edit (тот же компонент с другим поведением), React просто сохраняет предыдущее состояние формы, и я не вижу новую форму с пустыми данными. Он работает только тогда, когда я вызываю маршрут new откуда-то еще.React Router + Redux Form + Edit/New Component == Fail

Возможные маршруты:

  • /bastions/new - Отрисовывает компонент без данных

  • /bastions/:id - Оказывает компонент с существующими данными

Является ли эта проблема знакома для кого-то?

Просто какой-то код, чтобы сделать вещи чище (с наиболее соответствующими мирам):

Спасибо заранее.

class BastionForm extends Component { 

    componentWillMount() {  
     if(this.props.bastion.number) {  
      this.props.fetchBastion(this.props.params.number); 
     } 
    } 

    renderField({ input, label, type, meta: { touched, error, warning } }) { 
     return (
      <FormGroup controlId={label} {...validation}> 
       <ControlLabel>{label}</ControlLabel> 
       <FormControl {...input} placeholder={label} type={type} /> 
       <FormControl.Feedback /> 
      </FormGroup> 
     ); 
    } 

    render() { 
     const { handleSubmit, pristine, reset, submitting } = this.props; 

     return (
      <form onSubmit={handleSubmit(this.onSubmit.bind(this)) }> 
       <h3>Create a new Bastion</h3> 

       <Field name="sample" type="text" component={this.renderField} /> 

       <ButtonToolbar> 
        <Button bsStyle="primary" disabled={submitting}>Submit</Button> 
       </ButtonToolbar> 
      </form> 
     ); 
    } 
} 

BastionForm = reduxForm({ 
    form: 'BastionForm', 
    enableReinitialize: true 
})(BastionForm); 

BastionForm = connect(
    state => ({ 
     initialValues: state.bastions.bastion 
    }), { fetchBastion } 
)(BastionForm); 

export default BastionForm; 

ответ

0

componentWillMount только вызывается один раз перед установкой. Поскольку /bastions/new и /bastions/:id на самом деле ссылаются на тот же маршрут, BastionForm не будет размонтирован, если ваш путь изменится с /bastions/:id на /bastions/new. Таким образом, вы можете решить, показывать ли существующие данные или показывать без данных, изменив состояние BastionForm (отправьте действие). Затем отрегулируйте реквизит в componentWillReceiveProps.

+0

Благодарим вас за поддержку и извините за задержку ответа. Ты прав! componentWillReceiveProps решила проблему. Но мне интересно, что вы сказали, что оба/bastions /: id и/bastions/new относятся к одному и тому же маршруту, и я предполагаю, что это потому, что первый имеет URL-адрес (id) и может быть заменен на любая строка (например, «новая» в этом случае), и поэтому BastionForm не будет размонтирован. Но даже полностью изменив маршруты, они не сработали. Является ли это поведение чем-то связанным с состоянием unsync для редукции и реагирования? –

+0

Если два маршрута относятся к одному и тому же компоненту (например, 'BastionForm'), он все равно не будет воссоздавать компонент, даже если эти два маршрута совершенно разные. Кроме того, если ответ правильный, отметьте его принятым, чтобы сделать его очевидным для других парней, столкнувшихся с одним и тем же вопросом. –

+0

Хорошо, я понял. Спасибо за ответ! –

Смежные вопросы