В качестве примера того, что я хотел бы сделать, в Draft.js я хотел бы разрешить пользователям включать слайд-шоу изображений на страницу, которые позже могут измениться извне. Поэтому, если в моем приложении определено слайд-шоу, пользователь может выбрать это слайд-шоу для размещения на своей странице, и если изображения были изменены позже, они автоматически обновятся на странице. Также было бы неплохо иметь визуальное представление в редакторе. Я слишком много прошу или это возможно в Draft.js?
Пользовательские программируемые виджеты в Draft.js (плагин)
Ответы (1)
Это никогда не терпит неудачу. Я публикую вопрос и почти сразу же нахожу что-то, что может ответить на мой вопрос. В Draft.js есть так называемые «декораторы», которые в настоящее время задокументированы здесь: https://draftjs.org/docs/advanced-topics-decorators.html
По сути, вы бы создали серию декораторов, используя функции/компоненты. Стратегия берет на себя функцию, составляющая очевидна.
const compositeDecorator = new CompositeDecorator([
{
strategy: handleStrategy,
component: HandleSpan,
},
{
strategy: hashtagStrategy,
component: HashtagSpan,
},
]);
Стратегии могут быть определены с помощью регулярных выражений. Это позволяет вам написать свой собственный синтаксис или использовать синтаксис механизма шаблонов для встраивания виджетов. Стратегии в документации являются довольно хорошим примером:
// Note: these aren't very good regexes, don't use them!
const HANDLE_REGEX = /\@[\w]+/g;
const HASHTAG_REGEX = /\#[\w\u0590-\u05ff]+/g;
function handleStrategy(contentBlock, callback, contentState) {
findWithRegex(HANDLE_REGEX, contentBlock, callback);
}
function hashtagStrategy(contentBlock, callback, contentState) {
findWithRegex(HASHTAG_REGEX, contentBlock, callback);
}
function findWithRegex(regex, contentBlock, callback) {
const text = contentBlock.getText();
let matchArr, start;
while ((matchArr = regex.exec(text)) !== null) {
start = matchArr.index;
callback(start, start + matchArr[0].length);
}
}
А вот и компоненты:
const HandleSpan = (props) => {
return <span {...props} style={styles.handle}>{props.children}</span>;
};
const HashtagSpan = (props) => {
return <span {...props} style={styles.hashtag}>{props.children}</span>;
};
person
eltiare
schedule
31.03.2017
Я подожду пару дней, чтобы посмотреть, опубликует ли кто-нибудь лучшее решение, прежде чем принять это.
- person eltiare; 31.03.2017