组件通讯

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. 由浅入深Mysql优化

    选Mysql优化作为我的第一篇博文,实在是因为这个东西很有意思,也是能体现后端开发人员设计细节及逻辑分析的一个知识点. 那么来吧: 作为Mysql优化,很多人大概能跟着感觉说出如下   :  (1)常 ...

  2. BootStrap TreeView使用示例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. C语言-表达式

    表达式是使用运算符连接起来的式子,C语言中的表达式有以下几种: 1.算数运算符 + - * / % 2.赋值运算符 +=  -=  *=  /=  %= 3.自增.自减 ++   --   a++为先 ...

  4. Android与JNI(一) ---- Java调用C 静态调用

    第一.通过eclipse新建一个工程名为HelloJni的android工程,并编译. 第二.右键工程-->Android Tools --> Add Native Support,出现如 ...

  5. oracle系列--解锁数据库

    一.安装完成后解锁Scott数据库步骤: 进入SQL Plus 请输入用户名:sys输入口令:sys as sysdba  //这里的口令是不可见的,注意空格SQL> alter user sc ...

  6. bzoj1562[NOI2009]变换序列——2016——3——12

    任意门:http://www.lydsy.com/JudgeOnline/problem.php?id=1562 题目: 对于0,1,…,N-1的N个整数,给定一个距离序列D0,D1,…,DN-1,定 ...

  7. OC 优化目录

    把 main. info 和 appdelegate 放到自己的新建目录 1.去掉info.plist的警告 在build phases->copy Bundle Resources中去掉inf ...

  8. 【转】java调用存储过程和函数

    一.概述 如果想要执行存储过程,我们应该使用 CallableStatement 接口. CallableStatement 接口继承自PreparedStatement 接口.所以CallableS ...

  9. Web开发者的最爱 5个超实用的HTML5 API

    摘要:毫无疑问,HTML5已经成为当今最流行的一门技术,尤其是Web开发者们对HTML5的兴趣是日趋渐浓.HTML5的许多功能也都能在现代浏览器中得以实现.然而,作为开发者,除了关注HTML5的功能和 ...

  10. 启动子&外显子&内含子

    启动子 http://baike.baidu.com/link?url=HMqaMY4mXusH--4hMu1p6P_XUzEve9lZhFGtxScnbb8Z9HaLYJ981eWxAuZt2iAP ...