Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

questionAnswers state set to empty on rerender of <Winterfell /> #86

Open
geekyme opened this issue Mar 18, 2017 · 7 comments
Open

questionAnswers state set to empty on rerender of <Winterfell /> #86

geekyme opened this issue Mar 18, 2017 · 7 comments

Comments

@geekyme
Copy link

geekyme commented Mar 18, 2017

I'm wrapping Winterfell with a component which accepts a prop role and use it to fetch schema data dynamically.

It seems like whenever Winterfell is rerendered, due to my wrapper component rerendering (due to prop change), it's questionAnswers state is being set to {};

Sample code:

/**
*
* RoleForm
*
*/

import React, { PropTypes } from 'react';
// import styled from 'styled-components';
import Winterfell from 'winterfell';
import { getRoleFormSchema } from './schemas';
// import { FormattedMessage } from 'react-intl';
// import messages from './messages';

class RoleForm extends React.PureComponent { // eslint-disable-line react/prefer-stateless-function
  constructor(props) {
    super(props);

    this.state = {
      schema: getRoleFormSchema(props.role),
    };
  }

  shouldComponentUpdate() {
    // TODO the moment Winterfell rerenders, it causes questionAnswers state to disappear
    return false;
  }

  onFormRender() {

  }

  onFormUpdate() {
    // TODO check for branch changes and clear data from supplied schema
    // set a schema default value as undefined to clear it from the json payload on submit
    console.log('update', arguments);
  }

  onFormSwitchPanel() {

  }

  onFormSubmit(questionAnswers, target) {
    console.log('submit', arguments);
  }

  render() {
    return (
      <Winterfell
        disableSubmit
        schema={getRoleFormSchema()}
        onRender={this.onFormRender}
        onUpdate={this.onFormUpdate}
        onSwitchPanel={this.onFormSwitchPanel}
        onSubmit={this.onFormSubmit}
      />
    );
  }
}

RoleForm.propTypes = {
  role: PropTypes.object,
};

export default RoleForm;

Debugger:

screen shot 2017-03-19 at 2 49 52 am

The problem will happen the moment I remove that shouldComponentUpdate block above.

@andrewhathaway
Copy link
Owner

Hi @geekyme I believe this is by design, your parent component should be capturing the updates to answers and storing them, passing them back down. Otherwise there would be no "acceptable" way to flush out answers when you wanted to clear the form for example. Hope this helps!

@geekyme
Copy link
Author

geekyme commented Mar 21, 2017

@andrewhathaway so how do i pass them back down?

@andrewhathaway
Copy link
Owner

@geekyme You can pass them down using the questionAnswers prop. Let me know how you get on, and we can close this issue (I'll reopen it now).

@geekyme
Copy link
Author

geekyme commented Mar 24, 2017

I tried that, it doesn't seem to work when the form rerenders with the new props. The prepopulated questionAnswers doesn't fill up the form.

@andrewhathaway
Copy link
Owner

I'll investigate this at some point this weekend and have a look.

@andrewhathaway
Copy link
Owner

I've taken a quick look and I cannot reproduce this. Can you get me a test case please? Use this as a base: https://esnextb.in/?gist=07a8b8d62af04bb39693f8bae5344a8b

@JonathanLehner
Copy link

I got this problem as well. Just use
shouldComponentUpdate() {
// TODO the moment Winterfell rerenders, it causes questionAnswers state to disappear
return false;
}
as above and then it is fine.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants