• Omi框架学习之旅


    上一篇文章说了omi中的组件,以及组件如何使用及嵌套。

    那omi中的组件是怎么通讯的呢?

    其实omi提供的通讯方式比较丰富,各有千秋,各有各的场景用途。所以按需使用即可。

    老规矩:先上demo代码, 然后提出问题, 之后解答问题, 最后源码说明。

            class Hello extends Omi.Component {
                constructor(data) {
                    super(data);
                }
    
                style() {
                    return `
                        h1 {
                            cursor: pointer;
                        }
                    `;
                }
    
                handleClick(target, click) {
                    console.log(target.innerHTML);
                }
    
                render() {
                    return `
                        <div>
                            <h1 onclick="handleClick(this, event)">
                                Hello, {{name}}! {{str}} {{bool}} {{num}} {{arr}}
                            </h1>
                        </div>
                    `;
                }
            };
    
            Omi.makeHTML('Hello', Hello);
    
            class App extends Omi.Component {
                constructor(data) {
                    super(data);
                }
    
                render() {
                    return `
                        <div>
                            <Hello name='hel' data-name = "Sorrow.X" data-str = "str"/>
                            <Hello data-bool = true data-num = 111/>
                        </div>
                    `;
                }
            };
    
            var app = new App();
            Omi.render(app, 'body');
    
            setTimeout(() => {
                app.hel.data.name ='名字';
                app.hel.data.name ='str字符串';
                app.hel.update();
            }, 2000);

     先看看omi中文文档的说明:

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

        文档地址:https://alloyteam.github.io/omi/website/docs-cn.html#

    接下来说说这个demo的疑问和疑问的说明:

    疑问1:

    data-xxx后面的名字可以直接用在子类(这里指的是Hello)的render方法中吗?

    答:是的,作者是这么做到的。如下

    往下看

         

    我们来看看1这里的代码:

        _capitalize (str){    // data-xxx后面的xxx字符串
            str = str.toLowerCase();
            str = str.replace(/w+/g, function (word) {
                return word.substring(0, 1).toUpperCase() + word.substring(1);
            }).replace(/-/g,'');    // 第一个字母大写后面的小写
            return str.substring(0, 1).toLowerCase() + str.substring(1);    // 第一个字母小写后面的小写(全都小写)
        }

    之后得到dataset对象,里面有我们设置的值啦。

    然后就new 子类的实例,然后sub_child._childRender(childStr,true);(说明: 这里其实帮我们生成了子类的html和css还有事件的转换,组件那篇文章已经说过了)。

    之后就把该数据dataset给了子类实例的data属性(此demo只有dataset有数据合并了,如果其他对象有数据依次合并,属性相同的话,后面的会覆盖前面的Object.assign(baseData,child.childrenData[i],dataset,dataFromParent,groupData ))。

    疑问2:

    同一个Hello标签可以多次使用吗?

    答:那肯定撒,作者是这么做到的,如下:

    其实是遍历了2次

    那怎么合并到父组件中呢,其实回到_render方法中,如下

    然后渲染到dom中去了。

    然后就这么结束了。

    ps:通过data-✼通讯也是一锤子买卖。后续变更只能通过组件实例下的data属性去更新组件。

        所以最好指定子类的实例名比如name=hel,如demo中的,可以跟新数据。

        也可以指定omi-id,后续再讲。

  • 相关阅读:
    知识的本质
    福克斯保养注意事项及驾驶技巧
    转 网络编程
    Linux系统下安装 apache2.4的过程
    代码静态检查工具PCLint运用实践
    gcc编译系统
    量子计算机:决胜21世纪的利器
    关于ETL工具、方案的认识
    《HTTP: The Definitive Guide》读书笔记
    ArrayList(转用法)
  • 原文地址:https://www.cnblogs.com/sorrowx/p/6600910.html
Copyright © 2020-2023  润新知