组件通讯

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

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

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

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-*的局限性。

childrenData通讯

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

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

通过对象实例

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

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

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

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

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

  5. Omi框架学习之旅 - 组件通讯(data-*通讯) 及原理说明

    上一篇文章说了omi中的组件,以及组件如何使用及嵌套. 那omi中的组件是怎么通讯的呢? 其实omi提供的通讯方式比较丰富,各有千秋,各有各的场景用途.所以按需使用即可. 老规矩:先上demo代码, ...

  6. Angular4 组件通讯方法大全

    组件通讯,意在不同的指令和组件之间共享信息.如何在两个多个组件之间共享信息呢. 最近在项目上,组件跟组件之间可能是父子关系,兄弟关系,爷孙关系都有.....我也找找了很多关于组件之间通讯的方法,不同的 ...

  7. 【Vue】Vue中的父子组件通讯以及使用sync同步父子组件数据

    前言: 之前写过一篇文章<在不同场景下Vue组件间的数据交流>,但现在来看,其中关于“父子组件通信”的介绍仍有诸多缺漏或者不当之处, 正好这几天学习了关于用sync修饰符做父子组件数据双向 ...

  8. vue组件通讯方法汇总(在不使用vuex的情况下)

    前三种是父子组件通讯,最后一种是平级组件.

  9. Angular6 学习笔记——组件详解之组件通讯

    angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...

随机推荐

  1. jQuery中$.get、$.post、$.getJSON和$.ajax的用法

    以下是本人原创,如若转载和使用请注明转载地址.本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!博客地址 一.jQuery中调用ajax的4种方法:$.get.$.post.$ge ...

  2. 五、Hive

    一.Hive 1.1 Hive简介 1.2 Hive说明 1.3Hive的体系架构 来自为知笔记(Wiz)

  3. Linux SSL 双向认证 浅解

    请求方的操作:此步骤是为了验证CA的发证过程. 1.生成私钥:     Openssl genrsa 1024 > private.key  生成私钥并保存到private.key文件中    ...

  4. iOS给自定义个model排序

    今天有朋友问我怎么给Model排序,我顺便写了一个,伸手党直接复制吧. 例如,我建了一个Person类,要按Person的年龄属性排序: Person *per = [[Person alloc] i ...

  5. matlab获取向量中出现次数最多的元素

    向量X 1. tabulate(X) 返回一个矩阵:第一列为元素值,第二列为相应元素出现个数,第三列为相应元素个数占所有元素个数百分比 table = tabulate(X); %获取出现次数最多的元 ...

  6. XCode里的模拟器到底在哪里?我的App被放到哪里了?如何寻找真机的沙盒文件?

    一. 开发iOS,必然少不了和XCode这个家伙打交道.平时我们调试自己的App的时候,最常用到的就是模拟器Simulator了,调试的时候,我们的App会自动被XCode安装到模拟器中去,不过: 你 ...

  7. linux内核——1.概述

    1.结构 linux中,我们把操作系统分为内核空间和用户空间.用户通过用户空间与操作系统打交道.用户要通过系统调用访问内核空间.下图为Linux体系结构,shell应该为在最顶层. 系统调用,下面链接 ...

  8. java 对象比较

    class Book{    private String title ;    private double price ; public Book(String title , double pr ...

  9. BZOJ1237: [SCOI2008]配对

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1237 题目大意:你有n 个整数Ai和n 个整数Bi.你需要把它们配对,即每个Ai恰好对应一 ...

  10. centos 安装mysql 5.5.12

    1.安装gcc-c++  gcc make cmake编译器 2.安装ncurses 3.添加用户组 groupadd mysql useradd -r -g mysql mysql 4.安装 tar ...