#javascript #redux-saga #draftjs #react-boilerplate #react-draft-wysiwyg
#javascript #redux-saga #draftjs #реагировать-шаблонно #react-draft-wysiwyg
Вопрос:
Я использую оболочку react-draft-wysiwyg для Draft.js . На странице у меня есть несколько экземпляров компонента Editor. У меня проблема с медленным обновлением пользовательского интерфейса редактора ( onChange
обработчик событий). Возможно, это какой-то намек, я получаю много предупреждений в консоли [Violation] 'input' handler took <N>msA
.
Моя настройка:
- реагировать-шаблонно
- react-draft-wysiwyg
- сокращение
- redux-saga
- повторно выберите
Я отправляю действие для обработки изменения состояния редактора, которое обрабатывается redux-saga. Saga проверит, есть ли новое содержимое, и обновит хранилище.
export function* handleOnEditorStateChange({ editorState, nameSpace }) {
const actualEditorState = yield select(selectAllEditorsContent());
const editorIndexToUpdate = actualEditorState.findIndex(
editors => editors.name === nameSpace,
);
const currentContent = actualEditorState[
editorIndexToUpdate
].state.getCurrentContent();
const newContent = editorState.getCurrentContent();
const hasEditorNewContent = newContent !== currentContent;
if (hasEditorNewContent) {
const updatedEditorState = [...actualEditorState];
updatedEditorState[editorIndexToUpdate].state = editorState;
yield put(storeEditorStateAction(updatedEditorState));
}
}
Мое состояние redux выглядит следующим образом:
...
editors: [
{
name: 'editor1',
label: 'Editor 1',
state: {... _immutable - draftjs }
},
{
name: 'editor2',
label: 'Editor 2',
state: {... _immutable - draftjs }
},
]
...
Редуктор:
...
case STORE_EDITOR_STATE: {
const { content } = action;
return state.set('editors', content);
}
...
Ответ №1:
Я нашел решение своей проблемы. По крайней мере, некоторые ходят вокруг да около. Я изменил способ обработки действий в моей саге action watcher. Вместо takaLates
эффекта я изменил на throttle
с небольшой задержкой. И это намного, намного лучше.