博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Omi教程-组件通讯攻略大全
阅读量:6348 次
发布时间:2019-06-22

本文共 5179 字,大约阅读时间需要 17 分钟。

组件通讯

组建间的通讯非常遍历灵活,因为有许多可选方案进行通讯:

  • 通过在组件上声明 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  `      

Hello ,{
{name}}!

`; }}Omi.makeHTML('Hello', Hello);class App extends Omi.Component { constructor(data) { super(data); } render() { return `
`; }}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  `        
`; }}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  `        
`; }}...

childrenData通讯

...class App extends Omi.Component {    constructor(data) {      super(data);      this.childrenData = [{ name : 'Omi' } , { name : 'dntzhang' }];    }      render() {        return  `        
`; }}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  `        
`; }}Omi.render(new App(),"#container");

只需要在声明的子组件上标记group-data,就会去当前组件的instance(也就是this)下面找对应的属性,然后根据当前的位置,和对应数组的位置会一一对应起来。

运行结果如下:

105416-20170216110701535-1698390390.png

同样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  `        
`; }}Omi.render(new App(),"#container");

通过对象实例

...class App extends Omi.Component {    constructor(data) {        super(data);    }        installed(){        this.hello.data.name = "Omi";        this.update()    }      render() {        return  `        
`; }}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  `        
`; }}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的Github地址
  • 如果想体验一下Omi框架,请
  • 如果想使用Omi框架,请阅读
  • 如果想一起开发完善Omi框架,有更好的解决方案或者思路,请阅读
  • 关于上面的两类文档,如果你想获得更佳的阅读体验,可以访问
  • 如果你懒得搭建项目脚手架,可以试试
  • 如果你有Omi相关的问题可以
  • 如果想更加方便的交流关于Omi的一切可以加入QQ的Omi交流群(256426170)

105416-20170208095745213-1049686133.png

转载地址:http://byvla.baihongyu.com/

你可能感兴趣的文章
雨巷-戴望舒
查看>>
OpenCms创建网站过程图解——献给OpenCms的初学者们
查看>>
C++ 异常处理机制的实现
查看>>
Freebsd的ports命令
查看>>
分布式系统---幂等性设计
查看>>
【转】时钟周期,机器周期,指令周期的区别
查看>>
MYSQL 更新时间自己主动同步与创建时间默认值共存问题
查看>>
android 屏幕适配
查看>>
Android Activity的4种启动模式
查看>>
leetcode第一刷_Minimum Depth of Binary Tree
查看>>
pm2-webshell —— 基于浏览器的终端控制台
查看>>
Mysql基准测试
查看>>
Session 撰改演示
查看>>
【转】python3 发邮件实例(包括:文本、html、图片、附件、SSL、群邮件)
查看>>
事务隔离级别(图文详解)
查看>>
canvas系列教程08-canvas各种坑
查看>>
浅析package.json中的devdependencies 和 dependencies
查看>>
又一个 iOS 侧边栏组件: SideMenu
查看>>
Python每日一练0019
查看>>
vue.js 打包遇到的问题
查看>>