1. 程式人生 > >Omi教程-元件通訊攻略大全

Omi教程-元件通訊攻略大全

元件通訊

Omi框架組建間的通訊非常遍歷靈活,因為有許多可選方案進行通訊:

  • 通過在元件上宣告 data-* 傳遞給子節點
  • 通過在元件上宣告 data 傳遞給子節點 (支援複雜資料型別的對映)
  • 父容器設定 childrenData 自動傳遞給子節點
  • 宣告 group-data 傳遞(支援複雜資料型別的對映)
  • 完全面向物件,可以非常容易地拿到物件的例項,之後可以設定例項屬性和呼叫例項的方法

所以通訊變得暢通無阻,下面一一來舉例說明。

data-*通訊

class Hello extends Omi.Component {
    constructor(data) {
      super(data);
    }
    style () {
      return  `
      h1{
        cursor:pointer;
      }
      `;
    }
    handleClick(target, evt){
      alert(target.innerHTML);
    }
    render() {
      return  `
      <div>
        <h1 onclick="handleClick(this, event)">Hello ,{{name}}!</h1>
      </div>
        `;

    }
}

Omi.makeHTML('Hello', Hello);

class App extends Omi.Component {
    constructor(data) {
        super(data);
    }
  
    render() {
        return  `
        <div>
            <Hello data-name="Omi" />
        </div>
        `;
    }
}

Omi.render(new App(),"#container");

一般data-用來傳遞值型別,如string、number。值得注意的是,通過data-接收到的資料型別都是string,需要自行轉成number型別。
通常情況下,data-能滿足我們的要求,但是遇到複雜的資料型別是沒有辦法通過大量data-去表達,所以可以通過data通訊,請往下看。

data通訊

如上面程式碼所示,通過 data-name="Omi"可以把name傳遞給子元件。下面的程式碼也可以達到同樣的效果。

...
class App extends Omi.Component {
    constructor(data) {
      super(data);
      this.helloData = { name : 'Omi' };
    }
  
    render() {
        return  `
        <div>
            <Hello data="helloData" />
        </div>
        `;
    }
}

Omi.render(new App(),"#container");

使用data宣告,會去元件的instance(也就是this)下找對應的屬性,this下可以掛載任意複雜的物件。所以這也就突破了data-*的侷限性。

如果instance下面的某個屬性下面的某個屬性下面的某個陣列的第一個元素的某個屬性要作為data傳遞Hello怎麼辦?
沒關係,data宣告是支援複雜型別的,使用方式如下:

...
class App extends Omi.Component {
    constructor(data) {
        super(data);
        this.complexData ={
            a:{
                b:{
                    c:[
                        {
                            e:[{
                                name:'ComplexData Support1'
                            },{
                                name:'ComplexData Support2'
                            }]
                        },
                        {
                            name: 'ComplexData Support3'
                        }
                    ]
                }
            }
        };
    }
  
    render() {
        return  `
        <div>
            <Hello data="complexData.a.b.c[1]" />
        </div>
        `;
    }
}
...

childrenData通訊

...
class App extends Omi.Component {
    constructor(data) {
      super(data);
      this.childrenData = [{ name : 'Omi' } , { name : 'dntzhang' }];
    }
  
    render() {
        return  `
        <div>
            <Hello  />
            <Hello  />
        </div>
        `;
    }
}

Omi.render(new App(),"#container");

通用this.childrenData傳遞data給子元件,childrenData是一個數組型別,所以支援同時給多個元件傳遞data,與render裡面的元件會一一對應上。

group-data通訊

childrenData的方式可以批量傳遞資料給元件,但是有很多場景下data的來源不一定非要都從childrenData來,childrenData是個陣列,會和元件的順序一一對應,這就給不同傳遞方式的data必須全部集中的childrenData中,非常不方便。group-data專門為解決上面的痛點而生,專門是為了給一組元件批量傳遞data。

import Hello from './hello.js';


Omi.makeHTML('Hello', Hello);

class App extends Omi.Component {
    constructor(data) {
        super(data);
        this.testData = [{name: 'Omi'}, {name: 'dntzhang'}, {name: 'AlloyTeam'}];
    }

    render() {
        return  `
        <div>
            <Hello group-data="testData" />
            <Hello group-data="testData" />
            <Hello group-data="testData" />
        </div>
        `;

    }
}

Omi.render(new App(),"#container");

只需要在宣告的子元件上標記group-data,就會去當前元件的instance(也就是this)下面找對應的屬性,然後根據當前的位置,和對應陣列的位置會一一對應起來。

執行結果如下:

同樣group-data支援複雜資料型別的對映,需要注意的是,group-data對映的終點必須是一個數組:

import Hello from './hello.js';


Omi.makeHTML('Hello', Hello);

class App extends Omi.Component {
    constructor(data) {
        super(data);
        this.complexData ={
            a:{
                b:{
                    c:[
                        {
                            e:[{
                                name:'ComplexData Support1'
                            },{
                                name:'ComplexData Support2'
                            }]
                        },
                        {
                            name: 'ComplexData Support3'
                        }
                    ]
                }
            }
        };
    }

    render() {
        return  `
        <div>
            <Hello group-data="complexData.a.b.c[0].e" />
            <Hello group-data="complexData.a.b.c[0].e" />
        </div>
        `;

    }
}

Omi.render(new App(),"#container");

通過物件例項

...
class App extends Omi.Component {
    constructor(data) {
        super(data);
    }
    
    installed(){
        this.hello.data.name = "Omi";
        this.update()
    }
  
    render() {
        return  `
        <div>
            <Hello name="hello" />
        </div>
        `;
    }
}

Omi.render(new App(),"#container");

通過omi-id

...
class App extends Omi.Component {
    constructor(data) {
        super(data);
    }
    
    installed(){
        Omi.get("hello").data.name = "Omi";
        this.update()
    }
  
    render() {
        return  `
        <div>
            <Hello omi-id="hello" />
        </div>
        `;

    }
}

Omi.render(new App(),"#container");

通過在元件上宣告omi-id,在程式任何地方拿到該物件的例項。這個可以算是跨任意元件通訊神器。

特別強調

  • 通過childrenData或者data方式通訊都是一錘子買賣。後續變更只能通過元件例項下的data屬性去更新元件
  • 通過data-✼通訊也是一錘子買賣。後續變更只能通過元件例項下的data屬性去更新元件。
  • 關於data-✼通訊也可以不是一錘子買賣,但是要設定元件例項的dataFirst為false,這樣的話data-✼就會覆蓋元件例項的data對應的屬性

關於上面的第三條也就是這樣的邏輯虛擬碼:

if(this.dataFirst){
    this.data = Object.assign({},data-✼ ,this.data);
}else{
    this.data = Object.assign({},this.data, data-✼);
}

招募計劃

  • 如果想使用Omi框架,請閱讀 Omi使用文件
  • 如果想一起開發完善Omi框架,有更好的解決方案或者思路,請閱讀 從零一步步打造web元件化框架Omi
  • 關於上面的兩類文件,如果你想獲得更佳的閱讀體驗,可以訪問Docs Website
  • 如果你有Omi相關的問題可以New issue
  • 如果想更加方便的交流關於Omi的一切可以加入QQ的Omi交流群(256426170)

相關推薦

Omi教程-元件通訊大全

元件通訊 Omi框架組建間的通訊非常遍歷靈活,因為有許多可選方案進行通訊: 通過在元件上宣告 data-* 傳遞給子節點 通過在元件上宣告 data 傳遞給子節點 (支援複雜資料型別的對映) 父容器設定 childrenData 自動傳遞給子節點 宣告 group-data 傳遞(支援複雜資料型別的對映)

>>紅色警戒2大全

>>紅色警戒2攻略大全<< 紅色警戒2兵臨城下4的地圖修改rules.ini規則無限錢程式碼: 可以用rules.ini修改,紅色警戒2通用的。我就用規則幾分鐘過了解放臺灣,呵呵! 就下最下面一個吧!解壓至你的紅色警戒2兵臨城下資料夾之下就行了

使用C#開發ActiveX控制元件

前言: 這段時間因為工作的需要,研究了一下ActiveX控制元件。總結如下: 先說說ActiveX的基本概念。 根據微軟權威的軟體開發指南MSDN(Microsoft Developer Network)的定義,ActiveX外掛以前也叫做OLE控制元件或OCX控制元件,它是一些軟體元件或物件,可

輕松學習之Linux教程四 神器vi程序編輯器

分享 內置 snippet 2014年 答案 程序 ice 界面 fff 本系列文章由@超人愛因斯坦出品,轉載請註明出處。 文章鏈接: http://hpw123.net/a/Linux/Linuxjichu/2014

maven教程

教程 bean 然而 mave 外部依賴 創建 包含 冗余 快照 maven教程全攻略 我們在開發項目的過程中,會使用一些開源框架、第三方的工具等等,這些都是以jar包的方式被項目所引用,並且有些jar包還會依賴其他的jar包,我們同樣需要添加到項目中,所有這些相關的ja

微信小程序全面實戰,架構設計 && 躲坑(小程序入門捷徑教程)

question 取數 fresh 成了 圓點 near etc .get 甚至有 轉自:http://www.cnblogs.com/dragondean/p/6247643.html 最近集中開發了兩款微信小程序,分別是好奇心日歷(每天一條辭典+一個小投票)和好奇

最新亞馬遜 Coupons 功能設置教程完整

天才 product oda 提交 geb mem detail red 郵件營銷 最新亞馬遜 Coupons 功能設置教程完整攻略! http://m.cifnews.com/app/postsinfo/18479

阿裏雲代金券領取教程【2018最新篇】

height 不錯 con ack 選擇 購物 nta 性價比 width 經常有雲計算小白問我關於雲服務器運維、以及建站開發相關問題,前幾天很多人問筆者,買雲服務器建議到哪家好?哪家的雲服務器性價比高、哪家雲服務器性能好?其實筆者用過的雲服務器提供商,就是使用過阿裏雲、騰

快速掌握TeeChart繪圖控制元件(C#)

在自己軟體開發過程中,常會用到繪圖控制元件,鑑於開發週期的限制,為了加快專案的開發效率,常選擇使用TeeChart圖表控制元件,快速將資料繪製成各式的曲線或圖表,直觀、形象地表示出資料傳遞出來的資訊,下面是小編為大家總結的TeeChart繪圖常用操作/屬性。 百度經驗:jingyan.ba

Bitmex套利快速入門教程

一.期貨基礎知識解釋 槓桿:類似於借的錢(或幣),持倉除以保證金就是槓桿倍數 保證金:相當於買房的訂金,你總不可能空手套白狼吧 現貨:成交的瞬間,貨(某數量的幣)就屬於你了 掉期合約:和期貨類似,只是沒有到期交割日 保證金:相當於買房的訂金,你總不可能空手套白

直播:網易視訊雲送上OBS直播完整版教程

OBS是什麼? OBS是一款直播串流軟體,中文無廣告,完全免費,含32位與64位版本,通吃各種電腦,支援MAC的OS X系統。 各大平臺都有自己的直播軟體了還需要用OBS麼? 因為,當前平臺直播軟體存在以下兩個方面問題: 1功能缺失,對採集卡,攝像頭,螢幕擷取,位元速率設定

這才叫新手教程,2019獻給所有小白的學習

邁入2019,你又立flag了嗎?如果還沒有,那麼加入小白入門興趣團吧,在這裡你會看到另一個世界,一個潛藏在真實世界之後的暗世界,你甚至會開始懷疑一直以來的生活場景,懷疑一切理所當然的事情。到底是有多麼不可思議呢,讓我們在新年之初開啟網路安全的學習之旅吧! 暗世界 任何事物都有對立面,看似美好的生活其實也

最詳細的maven教程之maven中級篇(二)

所有用Maven管理的真實的專案都應該是分模組的,每個模組都對應著一個pom.xml。它們之間通過繼承和聚合(也稱作多模組,multi-module)相互關聯。那麼,為什麼要這麼做呢?我們明明在開發一個專案,劃分模組後,匯入Eclipse變成了N個專案,這會帶來複雜度,給

[js高手之路]Vue2.0基於vue-cli+webpack父子元件通訊教程

在git命令列下,執行以下命令完成環境的搭建: 1,npm install --global vue-cli  安裝vue命令列工具 2,vue init webpack vue-demo   使用vue命令生成一個webpack專案,專案名稱為vue-demo 3,c

android螢幕適配的全3-動態獲取手機螢幕寬高及動態設定控制元件寬高

1.獲取手機螢幕寬高: DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int screenWidth = dm.width

北京簋街 美食完全 + 簋街好吃的夜宵去處-----店鋪介紹大全

*怡園 去怡園特意挑了一個工作日的中午,因為怕等座。沒想到這時也快滿座了,但好在停車場尚有餘位。我們走進裡院西屋落座,點了麻辣小龍蝦2份和半份花家八爺烤鴨半套(據服務小姐說味道和普通北京烤鴨不一樣)。這裡的麻辣小龍蝦20元/份,每份10只,合2元1只。邊品嚐著服務小姐推薦的祕製酸梅湯邊等上菜,這一等就是35分

VS2008\VS2010快捷鍵大全和自定義鍵設定

VS2010         VS2010快捷鍵設定         1.進入工具----選項  對話方塊         2.選擇  環境---->鍵盤         3.在 【顯示命令包含】 下面的對話方塊中輸入“對齊”關鍵字,然後就會在這個編輯框下面一個文字視

egg.js官方教程

一、文章前言 egg.js是node.js的一個web後臺框架,為我們進行web後臺開發帶來了太多的便利。諸如此類的框架還有很多,例如:express、koa。本文將著重討論egg.js,因為它是很嚴

Apple Pay如何使用?全網最完美(圖文教程)!

此前曝光已久的Apple Pay終於在今日凌晨5點正式上線,不過對於這個新傢伙,想必不少人會困擾Apple Pay如何使用的問題。 ——————什麼是Apple pay?—————— Apple Pay是蘋果公司在2014蘋果秋季新品釋出會上釋出的一款基於N

2019阿里雲開年Hi購季雲通訊分會場全

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>