Omi框架Store体系的前世今生

日期:2020-05-07编辑作者:Web前端

时间: 2019-09-09阅读: 925标签: store

原文链接-https://github.com/AlloyTeam/omi

在src下新建 store/myStore.js

Store 体系

先说说Store系统是干什么的!为什么要造这样一个东西?能够系统架构带来什么?

当我们组件之间,拥有共享的数据的时候,经常需要进行组件通讯。在Omi框架里,父组件传递数据给子组件非常方便:

  • 通过在组件上声明 data-* 或者 :data-* 传递给子节点
  • 通过在组件上声明 data 或者 :data 传递给子节点 (支持复杂数据类型的映射)
  • 声明 group-data 把数组里的data传给一堆组件传递(支持复杂数据类型的映射)

注:上面带有冒号的是传递javascript表达式

通过声明onXxx="xxxx"可以让子组件内执行父组件的方法。具体的如下图所示:

www.129028.com金沙 1

如果还不明白的话,那... 我就直接上代码了:

class Main extends Omi.Component {

    handlePageChange(index){
        this.content.goto(index+1)
        this.update()
    }

    render () {
        return `<div>
                    <h1>Pagination Example</h1>
                    <Content name="content" />
                    <Pagination
                        name="pagination"
                        :data-total="100"
                        :data-page-size="10"
                        :data-num-edge="1"
                        :data-num-display="4"     
                        onPageChange="handlePageChange" />
                </div>`;
    }
}

上面的例子中,

  • 父组件的render方法里,通过 data-✽ 传递数据给子组件 Pagination
  • 通过onPageChange="handlePageChange"实现子组件与父组件通讯

详细代码可以点击: 分页例子地址

当然你也可以使用event emitter / pubsub库在组件之间通讯,比如这个只有 200b 的超小库www.129028.com金沙,mitt 。但是需要注意mitt兼容到IE9+,Omi兼容IE8。但是,使用event emitter / pubsub库会对组件代码进行入侵,所以非常不建议在基础非业务组件使用这类代码库。

虽然组件通讯非常方便,但是在真实的业务场景中,不仅仅是父子、爷孙、爷爷和堂兄、嫂子和堂弟...
onXxx="xxxx"就显得无能为力,力不从心了,各种数据传递、组件实例互操作、 emitter/pubsub或者循环依赖,让代码非常难看且难以维护。所以:

Omi.Store是用来管理共享数据以及共享数据的逻辑 。

Omi Store使用足够简便,对架构入侵性极极极小(3个极代表比极小还要小)。下面一步一步从todo的例子看下Store体系怎么使用。

varmyStore={debug:true,state:{msg:"hello"},setMsgAction(newValue){if(this.debug)console.log("setMsgActiontriggedwith",newValue);this.state.msg=newValue;},clearMsgAction(){if(this.debug)console.log("clearMsgActiontrigged");this.state.msg="";}};exportdefaultmyStore

定义 Omi.Store

Omi.Store是基类,我们可以继承Omi.Store来定义自己的Store,比如下面的TodoStore。

import Omi from 'omi'

class TodoStore extends Omi.Store {
    constructor(data , isReady) {
        super(isReady)

        this.data = Object.assign({
            items:[],
            length:0
        },data)

        this.data.length = this.data.items.length
    }

    add(value){
        this.data.items.push(value)
        this.data.length = this.data.items.length
        this.update()
    }

    clear(){
        this.data.items.length = 0
        this.data.length = 0
        this.update()
    }
}

export default TodoStore

TodoStore定义了数据的基本格式和数据模型的逻辑。
比如 this.data 就是数据的基本格式:

{
    items:[],
    length:0
}

add和clear就是共享数据相关的逻辑。

值得注意的是,在add和clear方法里都有调用this.update();这个是用来更新组件的,this.update并不会更新所有组件。但是他到底会更新哪些组件呢?等讲到store的addView方法你就明白了。

在需要使用store 的 .vue 文件里面引入

创建 Omi.Store

通过 new 关键字来使用TodoStore对象的实例。

let store = new TodoStore({ /* 初始化数据 */ ,/* 数据是否准备好 */  })

上面可以传入一些初始化配置信息,store里面便包含了整个应用程序共享的状态数据以及贡献数据逻辑方法(add,clear)。

当然,这些初始化配置信息可能是异步拉取的。所以,有两种方法解决异步拉取store配置的问题:

  • 拉取数据,然后new TodoStore(),再Omi.render
  • 先let store = new TodoStore(),再Omi.render,组件内部监听store.ready,拉取数据更改store的data信息,然后执行store.beReady()
importmyStorefrom"@/store/myStore";//导入myStore文件

根组件注入 store

为了让组件树能够使用到 store,可以通过Omi.render的第三个参数给根组件注入 store:

Omi.render(new Todo(),'body',{
    store: store
});

当然ES2015已经允许你这样写了:

Omi.render(new Todo(),'body',{
    store
});

两份代码同样的效果。

通过Omi.render注入之后,在组件树的所有组件都可以通过 this.$store 访问到 store。

本文由www.129028.com金沙发布于Web前端,转载请注明出处:Omi框架Store体系的前世今生

关键词:

前端工程师如何才能不焦虑?

时间: 2019-09-09阅读: 99标签: 焦虑引言 时间: 2019-07-28阅读: 247标签: 技术 进入2019年,中国互联网充满了焦虑的气息,不...

详细>>

详解使用React.memo来优化函数组件的性能_javascript技巧_脚本之家

时间: 2019-09-07阅读: 224标签: 优化 React核心开发团队一直都努力地让React变得更快。在React中可以用来优化组件性能的方...

详细>>

简单实现一个vue的双向绑定www.129028.com金沙:

时间: 2019-09-07阅读: 149标签: 双向绑定 ## 属性的类型 - 属性可分为类属性和实例属性 首先我们来看一些,vue的基本使...

详细>>

vue单元测试学习笔记www.129028.com金沙

时间: 2019-09-08阅读: 146标签: 测试 单元测试是什么 维基百科:单元测试是针对 程序的最小单元 来进行正确性检验的测...

详细>>