Omi教程-组件

组件

Omi框架完全基于组件体系设计,我们希望开发者可以像搭积木一样制作Web程序,一切皆是组件,组件也可以嵌套子组件形成新的组件,新的组件又可以当作子组件嵌套至任意组件形成新的组件...

简单组件

这里使用Todo的例子来讲解Omi组件体系的使用。

class Todo extends Omi.Component {
    constructor(data) {
        super(data);
    }
    add (evt) {
        evt.preventDefault();
        this.data.items.push(this.data.text);
        this.data.text = '';
        this.update();
    }

    style () {
        return `
        h3 { color:red; }
        button{ color:green;}
        `;
    }

    handleChange(target){
        this.data.text = target.value;
    }

    render () {
        return `<div>
                    <h3>TODO</h3>
                    <ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>
                    <form onsubmit="add(event)" >
                        <input type="text" onchange="handleChange(this)"  value="{{text}}"  />
                        <button>Add #{{items.length}}</button>
                    </form>
                </div>`;
    }
}

Omi.render(new Todo({ items: [] ,text : '' }),"body");

组件生成的HTML最终会插入到body中。上面的例子展示了Omi的部分特性:

  • data传递: new Todo(data,..)的data可以直接提供给render方法里的模板
  • 局部CSS: h3只对render里的h3生效,不会污染外面的h3;button也是同样的
  • 声明式事件绑定: onchange调用的就是组件内的handleChange,this可以拿到当然的DOM元素,还可以拿到当前的event
  • 需要手动调用update方法才能更新组件

这里需要特别强调的是,为了更加的自由和灵活度。Omi没有内置数据变更的自动更新,需要开发者自己调用update方法。
你也可以和oba或者mobx一起使用来实现自动更新。

[点击这里->在线试试]

组件嵌套

如果页面超级简单的话,可以没有组件嵌套。但是绝大部分Web网页或者Web应用,需要嵌套定义的组件来完成所有的功能和展示。比如上面的Todo,我们也是可以抽取出List。
这样让程序易维护、可扩展、方便复用。如,我们抽取出List:

class List extends Omi.Component {
    constructor(data) {
        super(data);
    }

    render () {
        return `<ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>`;
    }
}

怎么使用这个List?我们需要使用Omi.makeHTML把List制作成可以声明式的标签,在render方法中就能直接使用该标签。如下所示:

import List from './list.js';

Omi.makeHTML('List', List);

class Todo extends Omi.Component {
    constructor(data) {
        super(data);
        this.data.length = this.data.items.length;
        this.listData = { items : this.data.items };
    }

    add (evt) {
        evt.preventDefault();
        this.list.data.items.push(this.data.text);
        this.data.length = this.list.data.items.length;
        this.data.text = '';
        this.update();
    }

    style () {
        return `
        h3 { color:red; }
        button{ color:green;}
        `;
    }

    handleChange(target){
        this.data.text = target.value;
    }

    render () {
        return `<div>
                    <h3>TODO</h3>
                    <List  name="list" data="listData" />
                    <form onsubmit="add(event)" >
                        <input type="text" onchange="handleChange(this)"  value="{{text}}"  />
                        <button>Add #{{length}}</button>
                    </form>
                </div>`;
    }
}
  • 第3行,通过makeHTML方法把组件制作成可以在render中使用的标签。当然Omi.makeHTML('List', List);也可以写在List组件的代码下面。
  • 第34行,在父组件上定义listData属性用来传递给子组件。
  • 第34行,在render方法中使用List组件。其中name方法可以让你在代码里通过this快速方法到该组件的实例。data="listData"可以让你把this.listData传递给子组件。

需要注意的是,父组件的this.listData会被通过Object.assign浅拷贝到子组件。
这样做的目的主要是希望以后DOM的变更都尽量修改子组件自身的data,然后再调用其update方法,而不是去更改父组件的listData。

关于Omi组件通讯其实有4种方案,这个后续教程会专门来讲。

点击这里→在线试试

招募计划

时间: 2024-09-16 13:09:32

Omi教程-组件的相关文章

jQuery Mobile教程:组件如何自动初始化

文章简介:本文我们来深度认识一下jQuery Mobile的内部设计原理中组件如何自动初始化. 本文我们来深度认识一下jQuery Mobile的内部设计原理中组件如何自动初始化 (注释:下面示例中的代码片段均来自1.1.0版本) 很多看过源码的同学或者使用过jquery mobile的同学们,大家有没有一个很大很大的问题:------- jquery mobile提供了几个组件,他们如何自动初始化的? !!重点说明:下面类似的自动初始化的流程多是在pagecreate触发后调用,有关pagec

Flash CS3 组件开发教程

教程|组件开发 [教程说明]:应云开等朋友的要求,我今天把组件开发过程整理一下,写成这篇教程.通过此篇教程你可以大致了解Flash 组件开发整个过程,希望对那些想自己开发Flash 组件的朋友有所帮助.我这次主要开发Flash 代码组件,甚至其他Flash 组件,你可以自行研究或和我一起讨论. [前提条件]:1.安装了Flash CS3软件:2.安装了Adobe Extension Manager 1.8 扩展管理器,如果没有请先到这里下载: [开发教程]:1.首先准备一个18x18的png 图

身怀绝技的开发者们,快来DataV玩转可视化组件

今天凌晨,当我们颤抖着双手敲完命令,大家期盼已久的开发者版上线了,DataV控制台里「我的组件」也新鲜出炉.开发者版支持用户上传自己开发的组件,拥有与众不同的可视化体验. 与此同时,开发者版正式面向所有企业版用户开放体验,身怀绝技的开发者们,赶紧来DataV开发和上传自己的组件吧. 1. 开发者版体验规则 (1) DataV企业版用户可以自助申请开发者版体验的功能.每个企业版用户的体验机会只有一次,体验到期后需要购买开发者版才可继续使用. (2)体验时长是2个月,在2个月的体验到期后,我们会自动

Chinaz菜单导航效果

首页 asp教程 . 基础教程 | 实例教程 | 高级教程 | 组件教程 javascript教程 . 基础教程 | 实例教程 | 高级教程 网站运营 . 建站经验 | 策划盈利 | 搜索优化 | 网站推广 | 免费资源 css方面 . 酷站推荐 | 网页设计 | WEB标准 | 设计活动 网络编程 . Asp编程 | Php编程 | .Net编程 | Xml编程 | Access | Mssql | Mysql 联盟资讯 . 联盟新闻 | 联盟介绍 服务器 . Web服务器 | Ftp服务器

GIS专业书籍、文档、数据、网站、工具等干货

整理.分享一些个人整理的GIS专业书籍.文档.数据.网站.工具等.也希望大家将自己的心得也分享出来,一起交流,共同进步. 如果下载链接失效,请到这里去:地信网 一.原理应用类 GIS基础类 01.地理信息系统--原理.方法和应用(邬伦)  Doc下载   PDF下载 02.地理信息系统概论(黄杏元)  PDF下载 03.地理信息系统导论(陈述彭) PDF下载 04.第一部分地图投影及其坐标转换公式   PDF下载 05.第二部分非地图投影坐标运算公式   PDF下载 06.GIS空间分析原理与方

本站索引帖

 **** Ext JS 3中文文档离线版下载 **** ExtJS4 專題 Ext概述系列 Ext 4 概述(一) Ext 4 概述(二)之Ext Core Ext 4 概述(三)之Env命名空间 & 语言增强包 & Ext.Function Ext 4 概述(四)之 ARIA.Data.Draw.Fx Ext 4 概述(五)之布局Layout.组件Component.Form Ext 4 概述(六)之Grid Ext 4 概述(七)之面板Panel & 杂项 个人整理资料 预览

jQuery Mobile教程:dialog组件close的api

文章简介:本文主要看一下jQuery Mobile体系中的dialog组件. 本文主要看一下jQuery Mobile体系中的dialog组件: 它开放了一个close的api 1.如何关闭dialog? 示例: //关闭dialog $("#close-dialog-btn").click(function(){ $("#alert-dialog").dialog("close"); }); 源码: //#4114 close:function

jQuery Mobile教程:grid组件设计实现细节

文章简介:本文我们来通过源码分析的方式,深度认识一下jQuery Mobile中grid组件的设计实现细节. 本文我们来通过源码分析的方式,深度认识一下jQuery Mobile中grid组件的设计实现细节 先看一下jquery.mobile-1.1.0.css的样式设计源码: /*grid的class*/ .ui-grid-a,.ui-grid-b,.ui-grid-c,ui-grid-d{ overflow:hidden; } /*block的class*/ .ui-block-a,.ui-

jQuery Mobile教程:dialog组件实现弹窗

文章简介:本文主要看一下jQuery Mobile体系中的dialog组件. 本文主要看一下jQuery Mobile体系中的dialog组件,我们采用"提问●回答"的方式来初步地了解一下: 1.如何设置alert dialog? 示例: <!-- a start --> <a href="#alert-dialog">如何设置alert dialog</a> <!-- a end --> <!-- dialog