Omim

Omi 打造的跨框架、跨主题组件库。任意框架使用、主题自由定制。

简介 - 图1

特性

  • 使用标准 Web Components 的 Custom Elements 渲染
  • 任意框架都可以使用这些组件(比如 Omi, React, Vue and Angular)
  • 同时支持 JSX 和 原生 HTML 标签的使用方式
  • 每个组件可以单独使用
  • 超级容易更换主题颜色、字体和圆角
  • 扩展了 HTML 能力,你可以通过字符串 '0' 或者字符串 'false' 传递 false 给元素

跨框架

使用指南

通过 script

  1. <script src="https://unpkg.com/omi"></script>
  2. <script src="https://unpkg.com/omim@latest/button/index.js"></script>
  3. <m-button>I am button</m-button>

通过 npm

  1. npm install omim

Then:

  1. import 'omim/button'

然后在任意框架中使用,比如 Omi, React, Vue or Angular:

  1. <m-button>I am button</m-button>

It can also be used in pure js:

  1. var button = document.createElement('m-button')
  2. button.innerHTML = 'I am button'
  3. document.body.append(button)
  4. button.addEventListener('click', function () {
  5. console.log('Clicked!')
  6. })
  7. //or
  8. //document.body.innerHTML = '<m-button>I am button</m-button>'

更改主题

  1. document.body.style.setProperty('--mdc-theme-primary', 'red')
  2. document.body.style.setProperty('--mdc-theme-secondary', 'blue')
  3. document.body.style.setProperty('--mdc-theme-error', 'yellow')

所有配置如下:

  1. --mdc-theme-primary: #0072d9;
  2. --mdc-theme-secondary: #2170b8;
  3. --mdc-theme-error: #f5222d;
  4. --mdc-theme-surface: #ffffff;
  5. --mdc-theme-on-primary: #ffffff;
  6. --mdc-theme-on-secondary: #ffffff;
  7. --mdc-theme-on-error: #ffffff;
  8. --mdc-theme-on-surface: #000000;
  9. --mdc-theme-background: #ffffff;
  10. --mdc-shape-small-component-radius: 4px;
  11. --mdc-shape-medium-component-radius: 4px;
  12. --mdc-shape-large-component-radius: 0px;
  13. --mdc-typography--font-family: Roboto, sans-serif;

HTML 扩展

当默认值为 true,需要传递 false 给 element 的时候,以前是历史难题,Omi 完美解决了这一点,你可以通过字符串 '0' 或者 字符串 'false' 来设置。

  1. define('my-element', class extends WeElement {
  2. static defaultProps = {
  3. show: true
  4. }
  5. static propTypes = {
  6. show: Boolean
  7. }
  8. render(props) {
  9. ...
  10. ...
  11. }
  12. })

Use:

  1. <my-element show="false"></my-element>

or

  1. <my-element show="0"></my-element>

React 中使用 omim

  1. /** @jsx nativeEvents */
  2. import nativeEvents from 'jsx-native-events'
  3. import { useState } from 'react'
  4. import 'omim/icon-button'
  5. export default function SomeComponent(props) {
  6. const [result, setSwitch] = useState(false)
  7. return (
  8. <div>
  9. <p>The switch is {result ? 'on' : 'off'}</p>
  10. <m-icon-button color="red" icons="['favorite', 'favorite_border']" onEventChange={e => setSwitch(e.detail.isOn)}>
  11. </m-icon-button>
  12. </div>
  13. )
  14. }

非常感谢 calebdwilliams 的 jsx-native-events

Vue 中使用 omim

  1. <script>
  2. import 'omim/icon-button'
  3. export default {
  4. name: 'HelloWorld',
  5. data: function() {
  6. return {
  7. result: false
  8. }
  9. },
  10. methods: {
  11. myEvent: function(evt) {
  12. this.result = evt.detail.isOn
  13. }
  14. }
  15. }
  16. </script>
  17. <template>
  18. <div class="component">
  19. <p>The switch is {{result? 'on' : 'off'}}</p>
  20. <m-icon-button color="red" icons="['favorite', 'favorite_border']" @change="myEvent"></m-icon-button>
  21. </div>
  22. </template>

要在 react 和 vue 中正常显示 icon,需要在 HTML 中引入下面的 CSS:

  1. <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">

贡献

一些命令

Build 组件:

  1. npm run build -- component-name

Build 所有组件:

  1. npm run build-all

Build 例子:

  1. npm start demo-name

发布:

  1. npm publish --access public

相关链接