Показать сообщение отдельно
  #1 (permalink)  
Старый 23.12.2019, 20:53
Аватар для komplekt_17
Аспирант
Отправить личное сообщение для komplekt_17 Посмотреть профиль Найти все сообщения от komplekt_17
 
Регистрация: 14.01.2017
Сообщений: 46

Как корректно подгрузить props в app react-redux компоненте
Всем здрасьте. У меня приложение react-redux. Мне нужно подгрузить динамически обновляемые пропсы в один из компонентов (./popups/EditNotePopup.js) с своим стейтом. Так вот сейчас нужные пропсы подгружаются только при повторном вызове(при повторном нажатии кнопки editNote). Я подозреваю, что некорректно использую componentWillReceiveProps(). Подскажите, как сделать правильно и почему?

import React, { Component } from "react";
import $ from "jquery";
import { serialiseEditorStateToRaw } from "draftjs-conductor";
import {
  EditorState,
  ContentState,
  convertFromHTML,
  convertFromRaw
} from "draft-js";
import { convertToHTML } from "draft-convert";
import { DraftailEditor, BLOCK_TYPE, INLINE_STYLE } from "draftail";
import {
  exporterConfig,
  CustomIcon,
  BR_ICON,
  UNDO_ICON,
  REDO_ICON
} from "../components";

import "draft-js/dist/Draft.css";
import "draftail/dist/draftail.css";

//для справки, если потребуется
[url]https://www.draftail.org/docs/controlled-component[/url]
[url]https://draftjs.org/docs/api-reference-content-state[/url]

export class EditNotePopup extends Component {
  
  getContent = stringHTML => {
    const blocksFromHTML = convertFromHTML(stringHTML);
    const content = ContentState.createFromBlockArray(
      blocksFromHTML.contentBlocks
    );
    return content;
  };

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

  onChange = editorState => this.setState({ editorState: editorState });

  clearEditor = () => {
    this.setState({ editorState: EditorState.createEmpty() });
  };

  componentWillReceiveProps() {
    if (this.props.textEditedNote !== "") {
      this.setState({
        editorState: EditorState.createWithContent(
          this.getContent(this.props.textEditedNote)
        )
      });
    }
  }

  // for export text note toHTML
  toHTML = raw =>
    raw ? convertToHTML(exporterConfig)(convertFromRaw(raw)) : "";

  render() {
    return (
      <div
        id="modal-editNote"
        className="modal fade"
        tabIndex={-1}
        role="dialog"
        aria-labelledby="exampleModalCenterTitle"
        aria-hidden="true"
      >
        <div className="modal-dialog modal-dialog-centered" role="document">
          <div className="modal-content">
            <div className="modal-header">
              <h5 className="modal-title">EditNote</h5>
              <button
                type="button"
                className="close"
                data-dismiss="modal"
                aria-label="Close"
              >
                <span aria-hidden="true">&times;</span>
              </button>
            </div>
            <form
              id="formEditNote"
              onSubmit={ev => ev.preventDefault()}
              className="needs-validation"
              noValidate
            >
              <div className="modal-body">
                <div className="form-label-group">
                  <label htmlFor="editTextNote">Text Note</label>
                  <DraftailEditor
                    editorState={this.state.editorState}
                    onChange={this.onChange}
                    }}
                  />
                </div>
              </div>
              <div className="modal-footer">
                <button
                  onClick={() => {
                    $("#modal-editNote").modal("hide");
                    const idNote = this.props.idNote;
                    const editedTextNote = this.toHTML(
                      serialiseEditorStateToRaw(this.state.editorState)
                    );
                    this.props.editNote(idNote, editedTextNote);
                    this.clearEditor();
                  }}
                  type="button"
                  className="btn btn-success btn-block mt-3"
                >
                  SAVE
                </button>
              </div>
            </form>
          </div>
        </div>
      </div>
    );
  }
}

link full project
https://codesandbox.io/s/noteeditors-co2pe
Ответить с цитированием