Как добавить настраиваемое раскрывающееся меню в react-draft-wysiwyg?

Мне нужно добавить настраиваемое раскрывающееся меню в раздел панели инструментов.

здесь прикрепленное изображение, похожее на раскрывающееся меню, это возможно?

<img src = "https://i.imgur.com/OhYeFsL.png" alt = "Dropdown menu editor">

найти подробное изображение ниже

Как добавить настраиваемое раскрывающееся меню в react-draft-wysiwyg?

Я использовал редактор контента response-draft-wysiwyg.

https://github.com/jpuri/react-draft-wysiwyg

https://jpuri.github.io/react-draft-wysiwyg/#/d

добавить настраиваемое раскрывающееся меню в раздел панели инструментов.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
0
5 635
2

Ответы 2

Надеюсь, это все еще актуально, но вот мой путь.

Для настраиваемого раскрывающегося списка я создал новый компонент и использовал метод «добавления новой опции на панель инструментов» из документации https://jpuri.github.io/react-draft-wysiwyg/#/docs

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { EditorState, Modifier } from 'draft-js';

class Placeholders extends Component {
  static propTypes = {
    onChange: PropTypes.func,
    editorState: PropTypes.object,
  }

  state = {
    open: false
  }

  openPlaceholderDropdown = () => this.setState({open: !this.state.open})

  addPlaceholder = (placeholder) => {
    const { editorState, onChange } = this.props;
    const contentState = Modifier.replaceText(
    editorState.getCurrentContent(),
    editorState.getSelection(),
    placeholder,
    editorState.getCurrentInlineStyle(),
    );
    onChange(EditorState.push(editorState, contentState, 'insert-characters'));
  }

  placeholderOptions = [
    {key: "firstName", value: "{{firstName}}", text: "First Name"},
    {key: "lastName", value: "{{lastName}}", text: "Last name"},
    {key: "company", value: "{{company}}", text: "Company"},
    {key: "address", value: "{{address}}", text: "Address"},
    {key: "zip", value: "{{zip}}", text: "Zip"},
    {key: "city", value: "{{city}}", text: "City"}
  ]

  listItem = this.placeholderOptions.map(item => (
    <li 
      onClick = {this.addPlaceholder.bind(this, item.value)} 
      key = {item.key}
      className = "rdw-dropdownoption-default placeholder-li"
    >{item.text}</li>
  ))

  render() {
    return (
      <div onClick = {this.openPlaceholderDropdown} className = "rdw-block-wrapper" aria-label = "rdw-block-control">
        <div className = "rdw-dropdown-wrapper rdw-block-dropdown" aria-label = "rdw-dropdown">
          <div className = "rdw-dropdown-selectedtext" title = "Placeholders">
            <span>Placeholder</span> 
            <div className = {`rdw-dropdown-caretto${this.state.open? "close": "open"}`}></div>
          </div>
          <ul className = {`rdw-dropdown-optionwrapper ${this.state.open? "": "placeholder-ul"}`}>
            {this.listItem}
          </ul>
        </div>
      </div>
    );
  }
}

export default Placeholders;

Я использовал настраиваемый раскрывающийся список для добавления заполнителей. Но суть остается прежней, потому что я использую пример из документации для настраиваемой кнопки.

Для визуализации самой кнопки я использовал тот же стиль, классы и структуру, что и для других раскрывающихся кнопок. Я просто переключил тег привязки на тег div и добавил пользовательские классы для стиля наведения и изменения моркови. Я также использовал события для переключения классов.

  .placeholder-ul{
    visibility: hidden;
  }
  .placeholder-li:hover {
    background: #F1F1F1;
  }

Наконец, не забудьте импортировать и добавить настраиваемую кнопку в редактор.

<Editor
   editorState = {this.state.editorState}
   onEditorStateChange = {this.onEditorStateChange}
   toolbarCustomButtons = {[<Placeholders />]}
/>

Может быть, вы могли бы предложить, как можно использовать modalHandler, чтобы закрыть раскрывающийся список, если пользователь щелкает мышью? jpuri.github.io/react-draft-wysiwyg/#/docs Я пробовал использовать приведенный там пример, но не могу решить проблему, когда раскрывающийся список открывается, если пользователь щелкает в любом месте (закрывающая часть работает должным образом).

Tadej 22.07.2020 16:56

Привет, @Tomas, Могу ли я визуализировать HTML с помощью настраиваемой кнопки на панели инструментов?

Mustafa Tığ 03.02.2021 13:29

Я использовал его код Томаса и немного обновил его до компонентов TypeScript / Function. Могу согласиться, что это решение все еще работает в 2020 году с Draft.js v0.10.5

type ReplacementsProps = {
  onChange?: (editorState: EditorState) => void,
  editorState: EditorState,
}


export const Replacements = ({onChange, editorState}: ReplacementsProps) => {
  const [open, setOpen] = useState<boolean>(false);

  const addPlaceholder = (placeholder: string): void => {
    const contentState = Modifier.replaceText(
      editorState.getCurrentContent(),
      editorState.getSelection(),
      placeholder,
      editorState.getCurrentInlineStyle(),
    );
    const result = EditorState.push(editorState, contentState, 'insert-characters');
    if (onChange) {
      onChange(result);
    }
  };

  return (
    <div onClick = {() => setOpen(!open)} className = "rdw-block-wrapper" aria-label = "rdw-block-control" role = "button" tabIndex = {0}>
      <div className = "rdw-dropdown-wrapper rdw-block-dropdown" aria-label = "rdw-dropdown" style = {{width: 180}}>
        <div className = "rdw-dropdown-selectedtext">
          <span>YOuR TITLE HERE</span>
          <div className = {`rdw-dropdown-caretto${open ? 'close' : 'open'}`} />
        </div>
        <ul className = {`rdw-dropdown-optionwrapper ${open ? '' : 'placeholder-ul'}`}>
          {placeholderOptions.map(item => (
            <li
              onClick = {() => addPlaceholder(item.value)}
              key = {item.value}
              className = "rdw-dropdownoption-default placeholder-li"
            >
              {item.text}
            </li>
          ))}
        </ul>
      </div>
    </div>
  );
};

Другие вопросы по теме