Мне нужно добавить настраиваемое раскрывающееся меню в раздел панели инструментов.
здесь прикрепленное изображение, похожее на раскрывающееся меню, это возможно?
<img src = "https://i.imgur.com/OhYeFsL.png" alt = "Dropdown menu editor">
найти подробное изображение ниже
Я использовал редактор контента response-draft-wysiwyg.
https://github.com/jpuri/react-draft-wysiwyg
https://jpuri.github.io/react-draft-wysiwyg/#/d
добавить настраиваемое раскрывающееся меню в раздел панели инструментов.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Надеюсь, это все еще актуально, но вот мой путь.
Для настраиваемого раскрывающегося списка я создал новый компонент и использовал метод «добавления новой опции на панель инструментов» из документации 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 />]}
/>
Привет, @Tomas, Могу ли я визуализировать HTML с помощью настраиваемой кнопки на панели инструментов?
Я использовал его код Томаса и немного обновил его до компонентов 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>
);
};
Может быть, вы могли бы предложить, как можно использовать modalHandler, чтобы закрыть раскрывающийся список, если пользователь щелкает мышью? jpuri.github.io/react-draft-wysiwyg/#/docs Я пробовал использовать приведенный там пример, но не могу решить проблему, когда раскрывающийся список открывается, если пользователь щелкает в любом месте (закрывающая часть работает должным образом).