组件通讯

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. Flask 通关攻略大全

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

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

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

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

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

  6. maven教程全攻略

    maven教程全攻略 我们在开发项目的过程中,会使用一些开源框架.第三方的工具等等,这些都是以jar包的方式被项目所引用,并且有些jar包还会依赖其他的jar包,我们同样需要添加到项目中,所有这些相关 ...

  7. Xlua使用教程、攻略

    Xlua 使用指南 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创新! ...

  8. Anaconda使用教程全攻略

    Anaconda使用教程全攻略 本文转自 https://zhuanlan.zhihu.com/p/32925500           〇.序 Python是一种面向对象的解释型计算机程序设计语言, ...

  9. phpMyAdmin 安装教程全攻略

    管理MYSQL数据库的最好工具是PHPmyAdmin,现在最新版本是phpMyAdmin 2.9.0.2,这是一个国际上开源的软件,一直在更新版本,你可以从 http://www.phpmyadmin ...

随机推荐

  1. (简单) HDU 3397 Sequence operation,线段树+区间合并。

    Problem Description lxhgww got a sequence contains n characters which are all '0's or '1's. We have ...

  2. Android控件系列之RadioButton&RadioGroup

    学习目的: 1.掌握在Android中如何建立RadioGroup和RadioButton 2.掌握RadioGroup的常用属性 3.理解RadioButton和CheckBox的区别 4.掌握Ra ...

  3. c#中怎么求百分比

    string Scorepercent = (lowScoreNum*1.0/ ScoreNum).ToString("P");//百分比 ToString("P&quo ...

  4. NSDate常用代码范例

    NSDate常用代码范例 NSDate类用于保存时间值,同时提供了一些方法来处理一些基于秒级别时差(Time Interval)运算和日期之间的早晚比较等. 1. 创建或初始化可用以下方法 用于创建N ...

  5. OpenGL ES

    前言 OpenGL ES是Khronos Group创建的一系列API中的一种(官方组织是:http://www.khronos.org/).在桌面计算机上有两套标准的 3DAPI:Direct3D和 ...

  6. Linux文件锁学习-flock, lockf, fcntl

    参考  linux中fcntl().lockf.flock的区别 这三个函数的作用都是给文件加锁,那它们有什么区别呢? 首先flock和fcntl是系统调用,而lockf是库函数.lockf实际上是f ...

  7. myeclipse的常用快捷键

    创建一个类 Alt+Shift+N,C,输入Demo,回车 创建类属性 按3次下方向键,回车,输入String name;,回车 创建构造器 Alt+Shift+S,O,回车 创建getter/set ...

  8. 深入了解Bundle和Map

    [转]http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0402/2684.html 前言 因为往Bundle对象中放入Map实际上 ...

  9. 洛谷 P1359 租用游艇

    题目描述 长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,-,n.游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇.游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1& ...

  10. UVa 10827 - Maximum sum on a torus

    题目大意:UVa 108 - Maximum Sum的加强版,求最大子矩阵和,不过矩阵是可以循环的,矩阵到结尾时可以循环到开头.开始听纠结的,想着难道要分情况讨论吗?!就去网上搜,看到可以通过补全进行 ...