如何扩展draft-js-emoji-plugin的主题

4

我需要扩展draft-js-emoji-plugin中的几个CSS规则。

文档中提到的方法是将theme对象传递给配置:

const theme = {
  emojiSelectButton: 'someclassname'
};
const emojiPlugin = createEmojiPlugin({theme});

不幸的是,这会覆盖整个主题类名,而不是只添加一个类名。根据代码中的注释,这种行为是有意设计的:

// Styles are overwritten instead of merged as merging causes a lot of confusion.
//
// Why? Because when merging a developer needs to know all of the underlying
// styles which needs a deep dive into the code. Merging also makes it prone to
// errors when upgrading as basically every styling change would become a major
// breaking change. 1px of an increased padding can break a whole layout.
相关问题中的开发人员建议导入draft-js-emoji-plugin/lib/plugin.css并在代码中进行扩展。无论如何,此文件中的每个类名都带有后缀(CSS模块),它们可能会被更改,因此不可靠。

我不知道如何在不复制整个主题的情况下应用几个修复程序。

2个回答

4
更好的方法是导入 {defaultTheme} from 'draft-js-emoji-plugin',然后按照以下方式进行扩展:
import emojiPlugin, { defaultTheme } from 'draft-js-emoji-plugin';

// say i need to extend the emojiSelectPopover's css then.

defaultTheme.emojiSelectPopover = defaultTheme.emojiSelectPopover + " own-class"

// own class is a class with your required enhanced css. this helps in preserving the old css.

const emojiPlugin  = createEmojiPlugin({
    theme : defaultTheme
})

因此您可以根据自己的需要使用该插件。


1
请记得在添加自己的类之前加上一个“ ”(空格)。否则,它会覆盖已经存在的内容。 - Chris Jones

1

拥有这样的灵活性很好,但重写所有类真的很痛苦。 我的做法是将所有类名提取到一个对象中,并使用styled-components将classNames插入到css定义中。这样你就可以扩展任何你想要的东西,而不必担心样式后缀类(并且当它们升级版本时会更改)。 在这个gist中,我只是复制了draft-js-emoji-plugin v2.1.1中的所有样式。

const theme = {
  emoji: 'my-emoji',
  emojiSuggestions: 'my-emojiSuggestions',
  emojiSuggestionsEntry: 'my-emojiSuggestionsEntry',
  // ...
  emojiSelect: 'emojiSelect',
  emojiSelectButton: 'emojiSelectButton',
  emojiSelectButtonPressed: 'emojiSelectButtonPressed',
}

const StyledEmojiSelectWrapper = styled.div`
  .${theme.emojiSelect} {
      display: inline-block;
    }
  .${theme.emojiSelectButton}, .${theme.emojiSelectButtonPressed} {
    margin: 0;
    padding: 0;
    width: 2.5em;
    height: 1.5em;
    box-sizing: border-box;
    line-height: 1.2em;
    font-size: 1.5em;
    color: #888;
    background: #fff;
    border: 1px solid #ddd;
    border-radius: 1.5em;
    cursor: pointer;
  }
  .${theme.emojiSelectButton}:focus, .${theme.emojiSelectButtonPressed}:focus {
    outline: 0;
    /* reset for :focus */
  }
  // ...
`

export const GlobalStyleForEmojiSelect = createGlobalStyle`
  .${theme.emoji} {
    background-position: center;
    //...
  }

export default (props) => (
  <StyledEmojiSelectWrapper>
    <GlobalStyleForEmojiSelect />
    <EmojiSelect /> // lib button component
  </StyledEmojiSelectWrapper>
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,