Problema de re-renderização do componente [trecho anexado]

Sep 03 2020

Estou fazendo um aplicativo construtor de currículo e toda a estrutura está quase pronta.

Códigosandbox completos de trabalho:

Aqui, transformei os componentes em passo-a-passo para cada seção,

index.js

<form onSubmit={handleSubmit}>
        <Stepper
          steps={sections}
          activeStep={currentPage}
          activeColor="red"
          defaultBarColor="red"
          completeColor="green"
          completeBarColor="green"
        />

        {currentPage === 1 && (
          <>
            <BasicDetails />
            <button onClick={next}>Next</button>
          </>
        )}

        {currentPage === 2 && (
          <>
            <EmploymentDetails />
            <div style={{ display: 'flex', justifyContent: 'space-between' }}>
              <button onClick={prev}>Back</button>
              <button onClick={next}>Next</button>
            </div>
          </>
        )}

        {currentPage === 3 && (
          <>
            <pre>{JSON.stringify(value, null, 2)}</pre>
            <div style={{ display: 'flex', justifyContent: 'space-between' }}>
              <button onClick={prev}>Back</button>
              <button onClick={handleSubmit}>Submit</button>
            </div>
          </>
        )}
      </form>

Etapas para reproduzir o problema:

-> Em Step 1Enter First Name, Last NameeProfile Summary

-> Clique no Nextbotão para ir para a próxima etapa.

-> Em seguida, clique no botão Voltar para voltar para Step 1(Atualmente em Step 2)

-> aqui os valores First Name, Last Nameestão lá, mas o valor inserido no editor de texto só se perde

Consulte a imagem abaixo com o valor do editor de texto inserido para melhor compreensão do problema que estou enfrentando.

O valor do editor de texto sozinho se perde se mudarmos forth/backas etapas. Mas o valor inserido é armazenado no formulário Contexto e não é renderizado na caixa Editor de Texto.

Nota:

O editor de texto é feito como um componente e foi usado em Step 1(Para resumo do perfil) e também em Step 2(Para descrição de emprego) e em ambos os casos, alternando entre as etapas, o valor inserido no editor de texto se perde.

Análise:

Pelo meu entendimento, isso acontece porque ao navegar para outras etapas, o componente é renderizado novamente e o EditorContainercomponente é chamado e text_editor.jsnele foi fornecido

this.state = {
  editorState: EditorState.createEmpty(),
};

Portanto, foi criado vazio.

Então, como posso controlar o componente de ser renderizado novamente para que os dados inseridos no editor de texto não sejam perdidos.

Por favor, ajude-me a reter os valores inseridos no editor de texto. Muito obrigado antecipadamente ..

Respostas

2 bertdida Sep 04 2020 at 03:37

Isso acontece porque estamos apenas salvando nosso EditorContainervalor em nosso Context, mas não o estamos usando quando renderizamos o EditorContainercomponente.


A correção seria passar o objeto salvo valuecomo suporte para o nosso EditorContainercomponente.

Então, antes de tornar a EditorContainer, vamos converter essa valuea EditorStateque pode ser feito usando convertFromHTMLa função e defina-o como o nosso editorStateestado.

Etapa 1: passe a valueproposta paraEditorContainer

// basic_details.js
<EditorContainer
 name="profileSummary"
  value={basicDetails.profileSummary}
  onChange={(event) => handleInputChange(event)}
/>

// employment_details.js
<EditorContainer
  name="description"
  value={inputField.description}
  onChange={(event) => handleInputChange(index, event)}
/>

Etapa 2: converta o valuesuporte emEditorState

// text_editor.js
...

componentDidMount() {
  // https://draftjs.org/docs/api-reference-data-conversion/#convertfromhtml

  const { value } = this.props;
  const blocksFromHTML = convertFromHTML(value);
  const state = ContentState.createFromBlockArray(
    blocksFromHTML.contentBlocks,
    blocksFromHTML.entityMap,
  );

  const editorState = EditorState.createWithContent(state);
  this.setState({ editorState });
}

É isso aí! Confira a demonstração abaixo.

Edite a demonstração de correção para verificar valuese é uma string.

1 MosiaThabo Sep 03 2020 at 14:45

Esta é uma grande pergunta. Este é basicamente um problema de abordagem de design: para um cenário como o seu, você precisa projetar seu componente desta forma:

vamos analisar a imagem:

COMPONENTE PRINCIPAL:

Este é o componente que deve manter o estado de todo o processo de preenchimento de formulários. STE1-4 São apenas visualizações que permitem a entrada de dados que devem ser todos atualizados no componente principal. Isso significa que você deve ter estado no componente principal e passar as propriedades do estado e props, incluindo seus métodos de atualização / setter.

COMPONENTE DE PASSO Isso se aplica a todos os componentes de etapa. Esses componentes não devem fazer nada, exceto exibir a etapa do formulário usando valores de estado recebidos por meio propse atualizar o estado usando métodos setter, que também são recebidos por props.


Conclusão:

Coloque seu estado em seu componente principal, cada componente da etapa deve apenas exibir o formulário e atualizar o estado principal. Isso significa que, no momento em que cada componente da etapa for renderizado novamente, ele receberá os valores atualizados no componente principal. E você vai conseguir isso via props.

SergeyLukashev Sep 03 2020 at 14:37

É muito simples - você precisa armazenar o estado do editor em seu componente pai. Tente usar o estado BasicDetails para isso.