.omi 文件是一个自定义的文件类型,用类 HTML 语法描述一个 Omi 组件。每个 .omi 文件包含三种类型的顶级语言块 <template>
、<script>
和 <style>
:
1 | <template name="my-test"> |
Omil 会解析文件,提取每个语言块,如有必要会通过其它 loader 处理,最后将他们组装成一个 ES Module,它的默认导出是一个 Omi.js 组件定义好的自定义标签对象。
Omil 支持使用非默认语言,比如 CSS 预处理器,预编译的 HTML 模版语言,通过设置语言块的 lang 属性。例如,你可以像下面这样使用 Sass 语法编写样式:
1 | <style lang="sass"> |
<template>
模板每个 .omi 文件最多包含一个 <template>
块。
内容将被提取,如果是 JSX 会编译为函数片段,如果为 html 会编译为字符串,并最终注入到从<script>
导出的组件 render 函数中。
name = "xxx-xxx"
(Omi组件)定义name="xxx-xxx"
可以给组件定义一个名字,这个名字会自动调用 omi 框架的 define('xxx-xxx', xxxXxx)
方法来注册组件,你就可以在页面中用这个属性名<xxx-xxx></xxx-xxx>
来使用该组件
注意:
-
字符;<template>
模板中不能有<script>
和<style>
代码片段。1 | <template name="my-test"> |
在页面容器中如此使用
1 | <my-test/> |
name = "XxxXxx"
(React组件)定义name="XxxXxx"
可以给组件定义一个名字,这个名字会自动调用 React 框架的 React.Component
方法来定义类组件,你就可以在页面中用这个属性名<XxxXxx></XxxXxx>
来使用该组件
注意:
<template>
模板中不能有<script>
和<style>
代码片段。1 | <template name="MyTest"> |
在页面容器中如此使用
1 | <MyTest/> |
lang = "html"
(仅支持Omi)默认情况下,我们的<template>
模板是使用 JSX 语法,如果我们增加属性lang = "html"
,就可以支持编写html格式的字符串模板,你可以使用 ES6 的语法来编写 html 模板<div>${ this.data.msg }<div>
,Omil 和 Omi-Snippets 会自动帮你引入Omi.html()
方法帮你在客户端进行处理,会有一定的性能损耗,一般情况下不建议使用。
1 | <template name="my-test" lang="html"> |
<script>
脚本每个 .omi 文件最多包含一个 <script>
块。
如果我们使用过 react 我们会了解到组件通常有两种定义方式,一种是函数组件,一种是类组件,Omil 默认是帮你创建类组件,我们在export default class { // 你的代码 }
或者module.exports = class { // 你的代码 }
片段中写入你的组件逻辑代码,
注意:
export default class { // 你的代码 }
这种写法,class MyText {} ; export default MyText
这种写法不可以,因为 Omil 和 Omil Snippets 只识别连续的export default class
这段字符串export default class { // 你的代码 } |
可以 | 建议使用 |
---|---|---|
module.exports = class { // 你的代码 } |
可以 | 支持 |
class MyText { // 你的代码 } export default MyText |
不可以 | 不支持 |
class MyText { // 你的代码 } module.export = MyText |
不可以 | 不支持 |
1 | <script> |
有时候我们可以使用高阶组件拓展组件本身的一些功能,高阶组件跟类组件一样,只支持下面规定的写法。
export default HOC(class { // 你的代码 }) |
可以 | 建议使用 |
---|---|---|
module.exports = HOC(class { // 你的代码 }) |
可以 | 支持 |
class MyText { // 你的代码 } export default HOC(MyText) |
不可以 | 不支持 |
class MyText { // 你的代码 } module.export = HOC(MyText) |
不可以 | 不支持 |
1 | <script> |
下面是一个高阶组件的详细参考例子
1 | <template name="MyTest"> |
或者你可以这样写
1 | <template name="MyTest"> |
type="text/babel"
通常情况下,你可以在代码中使用ES6的语法,甚至一些新特性,例如:static
,某些情况下我们需要转化为ES5做兼容,我们可以添加属性type="text/babel"
1 | <script> |
<style>
样式一个 .omi 文件可以包含一个<style>
标签。
<style>
标签的样式本身具有局部样式的特性,这取决于 Omi 的设计是 Web Components,这有点类似于 Vue 的 scoped 属性。
1 | <style> |
lang = "scss"
我们还可以使用lang = "scss"
来书写 scss 样式,它会自动帮我们编译为 css 格式内容
1 | <style lang = "scss"> |
建议使用 VS Code 配合 Omi Snippets (该扩展支持语法高亮)扩展开发 Omi 项目,当然你可以把 .omi 文件当作 HTML 对待。
在语言块中使用该语言块对应的注释语法 (HTML、CSS、JavaScript 等)。
JSX 注释语法 | {/* comment contents here */} |
---|---|
HTML 注释语法 | <!-- comment contents here --> |