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

當耐特發表於2017-02-17

元件通訊

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>
        `;
    }
}
...複製程式碼

點選這裡→data對映覆雜資料

group-data通訊

group-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)下面找對應的屬性,然後根據當前的位置,和對應陣列的位置會一一對應起來。

執行結果如下:

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

點選這裡→group-data

同樣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");複製程式碼

點選這裡→group-data對映覆雜資料

通過物件例項

...
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,在程式任何地方拿到該物件的例項。

招募計劃

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

相關文章