组件通讯

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

  • 通过在组件上声明 data-* 传递给子节点
  • 通过在组件上声明 data 传递给子节点 (支持复杂数据类型的映射)
  • 父容器设置 childrenData 自动传递给子节点
  • 声明 group-data 传递(支持复杂数据类型的映射)
  • 完全面向对象,可以非常容易地拿到对象的实例,之后可以设置实例属性和调用实例的方法

所以通讯变得畅通无阻,下面一一来举例说明。

data-*通讯

  1. class Hello extends Omi.Component {
  2. constructor(data) {
  3. super(data);
  4. }
  5. style () {
  6. return `
  7. h1{
  8. cursor:pointer;
  9. }
  10. `;
  11. }
  12. handleClick(target, evt){
  13. alert(target.innerHTML);
  14. }
  15. render() {
  16. return `
  17. <div>
  18. <h1 onclick="handleClick(this, event)">Hello ,{{name}}!</h1>
  19. </div>
  20. `;
  21. }
  22. }
  23. Omi.makeHTML('Hello', Hello);
  24. class App extends Omi.Component {
  25. constructor(data) {
  26. super(data);
  27. }
  28. render() {
  29. return `
  30. <div>
  31. <Hello data-name="Omi" />
  32. </div>
  33. `;
  34. }
  35. }
  36. Omi.render(new App(),"#container");

一般data-用来传递值类型,如string、number。值得注意的是,通过data-接收到的数据类型都是string,需要自行转成number类型。

通常情况下,data-能满足我们的要求,但是遇到复杂的数据类型是没有办法通过大量data-去表达,所以可以通过data通讯,请往下看。

data通讯

如上面代码所示,通过 data-name="Omi"可以把name传递给子组件。下面的代码也可以达到同样的效果。

  1. ...
  2. class App extends Omi.Component {
  3. constructor(data) {
  4. super(data);
  5. this.helloData = { name : 'Omi' };
  6. }
  7. render() {
  8. return `
  9. <div>
  10. <Hello data="helloData" />
  11. </div>
  12. `;
  13. }
  14. }
  15. Omi.render(new App(),"#container");

使用data声明,会去组件的instance(也就是this)下找对应的属性,this下可以挂载任意复杂的对象。所以这也就突破了data-*的局限性。

如果instance下面的某个属性下面的某个属性下面的某个数组的第一个元素的某个属性要作为data传递Hello怎么办?

没关系,data声明是支持复杂类型的,使用方式如下:

  1. ...
  2. class App extends Omi.Component {
  3. constructor(data) {
  4. super(data);
  5. this.complexData ={
  6. a:{
  7. b:{
  8. c:[
  9. {
  10. e:[{
  11. name:'ComplexData Support1'
  12. },{
  13. name:'ComplexData Support2'
  14. }]
  15. },
  16. {
  17. name: 'ComplexData Support3'
  18. }
  19. ]
  20. }
  21. }
  22. };
  23. }
  24. render() {
  25. return `
  26. <div>
  27. <Hello data="complexData.a.b.c[1]" />
  28. </div>
  29. `;
  30. }
  31. }
  32. ...

点击这里→data映射复杂数据

childrenData通讯

  1. ...
  2. class App extends Omi.Component {
  3. constructor(data) {
  4. super(data);
  5. this.childrenData = [{ name : 'Omi' } , { name : 'dntzhang' }];
  6. }
  7. render() {
  8. return `
  9. <div>
  10. <Hello />
  11. <Hello />
  12. </div>
  13. `;
  14. }
  15. }
  16. Omi.render(new App(),"#container");

通用this.childrenData传递data给子组件,childrenData是一个数组类型,所以支持同时给多个组件传递data,与render里面的组件会一一对应上。

group-data通讯

childrenData的方式可以批量传递数据给组件,但是有很多场景下data的来源不一定非要都从childrenData来,childrenData是个数组,会和组件的顺序一一对应,这就给不同传递方式的data必须全部集中的childrenData中,非常不方便。group-data专门为解决上面的痛点而生,专门是为了给一组组件批量传递data。

  1. import Hello from './hello.js';
  2. Omi.makeHTML('Hello', Hello);
  3. class App extends Omi.Component {
  4. constructor(data) {
  5. super(data);
  6. this.testData = [{name: 'Omi'}, {name: 'dntzhang'}, {name: 'AlloyTeam'}];
  7. }
  8. render() {
  9. return `
  10. <div>
  11. <Hello group-data="testData" />
  12. <Hello group-data="testData" />
  13. <Hello group-data="testData" />
  14. </div>
  15. `;
  16. }
  17. }
  18. Omi.render(new App(),"#container");

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

运行结果如下:

点击这里→group-data

同样group-data支持复杂数据类型的映射,需要注意的是,group-data映射的终点必须是一个数组:

  1. import Hello from './hello.js';
  2. Omi.makeHTML('Hello', Hello);
  3. class App extends Omi.Component {
  4. constructor(data) {
  5. super(data);
  6. this.complexData ={
  7. a:{
  8. b:{
  9. c:[
  10. {
  11. e:[{
  12. name:'ComplexData Support1'
  13. },{
  14. name:'ComplexData Support2'
  15. }]
  16. },
  17. {
  18. name: 'ComplexData Support3'
  19. }
  20. ]
  21. }
  22. }
  23. };
  24. }
  25. render() {
  26. return `
  27. <div>
  28. <Hello group-data="complexData.a.b.c[0].e" />
  29. <Hello group-data="complexData.a.b.c[0].e" />
  30. </div>
  31. `;
  32. }
  33. }
  34. Omi.render(new App(),"#container");

点击这里→group-data映射复杂数据

通过对象实例

  1. ...
  2. class App extends Omi.Component {
  3. constructor(data) {
  4. super(data);
  5. }
  6. installed(){
  7. this.hello.data.name = "Omi";
  8. this.update()
  9. }
  10. render() {
  11. return `
  12. <div>
  13. <Hello name="hello" />
  14. </div>
  15. `;
  16. }
  17. }
  18. Omi.render(new App(),"#container");

通过omi-id

  1. ...
  2. class App extends Omi.Component {
  3. constructor(data) {
  4. super(data);
  5. }
  6. installed(){
  7. Omi.get("hello").data.name = "Omi";
  8. this.update()
  9. }
  10. render() {
  11. return `
  12. <div>
  13. <Hello omi-id="hello" />
  14. </div>
  15. `;
  16. }
  17. }
  18. Omi.render(new App(),"#container");

通过在组件上声明omi-id,在程序任何地方拿到该对象的实例。这个可以算是跨任意组件通讯神器。

特别强调

  • 通过childrenData或者data方式通讯都是一锤子买卖。后续变更只能通过组件实例下的data属性去更新组件
  • 通过data-✼通讯也是一锤子买卖。后续变更只能通过组件实例下的data属性去更新组件。
  • 关于data-✼通讯也可以不是一锤子买卖,但是要设置组件实例的dataFirst为false,这样的话data-✼就会覆盖组件实例的data对应的属性

关于上面的第三条也就是这样的逻辑伪代码:

  1. if(this.dataFirst){
  2. this.data = Object.assign({},data-✼ ,this.data);
  3. }else{
  4. this.data = Object.assign({},this.data, data-✼);
  5. }

招募计划

Omi教程-组件通讯攻略大全的更多相关文章

  1. Omi教程-通讯通讯攻略大全

    组件通讯 Omi框架组建间的通讯非常遍历灵活,因为有许多可选方案进行通讯: 通过在组件上声明 data-* 传递给子节点 通过在组件上声明 data 传递给子节点 (支持复杂数据类型的映射) 父容器设 ...

  2. Omi教程-组件通讯

    组件通讯 Omi框架组建间的通讯非常遍历灵活,因为有许多可选方案进行通讯: 通过在组件上声明 data-* 传递给子节点 通过在组件上声明 data 传递给子节点 父容器设置 childrenData ...

  3. Omi教程-组件

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

  4. Flask 通关攻略大全

    基本使用 from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello ...

  5. Omi框架学习之旅 - 通过对象实例来实现组件通讯 及原理说明

    组件通讯不是讲完了吗(上帝模式还没讲哈),怎么又多了种方式啊. 你484傻,多一种选择不好吗? 其实这个不属于组件通讯啦,只是当父组件实例安装和渲染完毕后,可以执行installed这个方法(默认是空 ...

  6. 来开源吧!发布开源组件到 MavenCentral 仓库超详细攻略

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...

  7. Windows英文版GitHub客户端使用操作流程图文攻略教程现没中文版

    Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.作为一个程序员,我们需要掌握其用法. 作为开源代码库以及版本控制系统,Github目前拥有140 ...

  8. EhLib DBGridEh组件在Delphi中应用全攻略总结(转)

    EhLib DBGridEh组件在Delphi中应用全攻略总结(转) http://blog.sina.com.cn/s/blog_94b1b40001013xn0.html 优化SQL查询:如何写出 ...

  9. 最新亚马逊 Coupons 功能设置教程完整攻略!

    最新亚马逊 Coupons 功能设置教程完整攻略! http://m.cifnews.com/app/postsinfo/18479 亚马逊总是有新的创意,新的功能.最近讨论很火的,就是这个 Coup ...

随机推荐

  1. 关于js脚本宿主对脚本代码的绑定

    脚本代码绑定,Unity3D是这样做的.为了体现Unity3D的基于对象设计,Unity3D可以为每个对象绑定多个脚本文件,可以是js,可以是cs,也可以是boo. threejs/editor也有与 ...

  2. linux tmp清理这些事

    tmp目录 首先看下FHS的定义. FHS(Filessystem Hierarchy Standard) 的重点在于规范每个特定的目录下应该要放置什么样子的数据. tmp约定的存放内容 /tmp 这 ...

  3. MongoDB 安装与配置

    MongoDB下载 官方下载链接:https://www.mongodb.com/download-center/community MongoDB安装 简单,按提示安装即可.安装方式: 1. Com ...

  4. RHEL 5.7 使用rpm安装XtraBackup问题总结

    在Red Hat Enterprise Linux Server release 5.7 (Tikanga)上使用RPM方式安装Percona Xtrabackup 2.4.6时遇到了一些问题,特意总 ...

  5. [20181116]18c DML 日志优化.txt

    [20181116]18c DML 日志优化.txt 1.环境:xxxxxxxx> select banner_full from v$version;BANNER_FULL---------- ...

  6. 操作系统常用调度算法(转载https://www.cnblogs.com/kxdblog/p/4798401.html)

    操作系统常用调度算法   在操作系统中存在多种调度算法,其中有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的调度算法两者都适用.下面介绍几种常用的调度算法. 先来先服务(FCFS)调度算法 ...

  7. JavaScript数据类型之文本类型

    引言 字符串(string)是一组由16位值组成的不可变的有序序列,每个字符通常来自于Unicode字符集.JavaScript通过字符串类型来表示文本.字符串的长度(length)是其所含16位值的 ...

  8. C#反射の反射接口

    C#反射の反射详解(点击跳转)C#反射の反射接口(点击跳转)C#反射反射泛型接口(点击跳转)C#反射の一个泛型反射实现的网络请求框架(点击跳转) 上一篇中叙述了反射的情况,下面主要讲一些反射的实际用途 ...

  9. C#编程の泛型编程

    什么是泛型 我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为 ...

  10. 利用碎片化时间Get Linux系统

    利用碎片化时间Get Linux系统 起初,我做着一份与IT毫无关系的工作,每月领着可怜的工资,一直想改变现状,但无从下手,也就是大家熟知的迷茫.我相信,每一个人都会或多或少的经历过迷茫,迷茫每一个选 ...