Dva: Models的设计

Created on 8 Dec 2016  ·  11Comments  ·  Source: dvajs/dva

Models中模块的划分应该以“页面纬度”来划分还是“数据纬度”来划分?

例如:
我的应用中的“数据”--- News新闻+User用户+Comment评论(3者数据独立)
我的应用中的“页面”---HomePage首页+UserPage我的页(2者都会不同程度使用到上面“数据”中的model和action)

1、创建HomePageModel和UserPageModel
在HomePageModel里面设计News+User的action和model
在UserPageModel里面设计User+Comment的action和model

2、建立NewsModel、UserModel和CommentModel
在HomePage页面中connect NewsModel、UserModel模块
在UserPage页面中connect UserModel、CommentModel模块

我应该基于哪种方式来设计Models呢?

question

Most helpful comment

@sorrycc
也就是说我可以把“数据纬度”和“页面纬度”完全分离,创建不同的models,在页面中connect对应的“页面纬度”的model和所需要的“数据维度”的model,是这样的吧。

function mapStateToProps(state) {
  return {
    // 数据维度创建的model
    users: state.users,
    comments:state.comments,
    // 页面维度创建的model
    homePage:state.homePage,
  };
}

All 11 comments

@nikogu
我觉得这个例子并没有回答我的问题
因为这个例子中只涉及到“单页面”+“单数据”
所以它既可以理解为“页面”来划分Models,也可以理解为是按照“数据”来划分的。
PS:这里说的“页面”划分Models指的是每个页面创建一个model,“数据”划分Models指的是每个独立的数据单元或是业务逻辑创建一个model。

这个例子的理解:
1.“页面”划分Models---如果再有一个新的页面,页面展示comments评论列表和它对应的users用户列表。那么就应该在创建一个叫做usersAndMessages的model,来给这个新的页面使用。
2.“数据”划分Models---如果这个页面中还需要展现comments评论列表,就要再创建一个叫做comments的model。

我的理解应该是一个“页面”对应一个“model”。
但是“页面”之间有些需要复用的部分怎么处理这个问题呢?
最终还是要把复用的action、reducers从models中分离出来?
但是这样不就又回归了redux那种传统的写法了?

我的理解应该是一个“页面”对应一个“model”。

model 和页面并不需要一一对应,可以分开设计,页面上需要啥数据就通过 connect 获取。

@sorrycc
也就是说我可以把“数据纬度”和“页面纬度”完全分离,创建不同的models,在页面中connect对应的“页面纬度”的model和所需要的“数据维度”的model,是这样的吧。

function mapStateToProps(state) {
  return {
    // 数据维度创建的model
    users: state.users,
    comments:state.comments,
    // 页面维度创建的model
    homePage:state.homePage,
  };
}

@zerozaki0752 对。

@sorrycc 谢谢!!!

还有一个疑问是关于action的
发现demo中的一些问题
1、model中effects、reducer中定义的方法,有些是model内部使用,有些则是要供view调用的(并没有明确的区分)
2、demo中view去调用action都是dispatch "namespace/functionName" 这样去调用的
3、在connect时并没有传入第2个参数mapDispatchToProps

我的预期的效果
在model中对需要view去调用的进行封装,之后mapDispatchToProps导入view中,view中可以直接通过props.namespace_functionName就可以触发action而不用每次dispatch

不知这样是否合理?是否可行?

这个看个人习惯了,我倾向于 dispatch(action) 的方式。

connect中没有传入mapDispatchToProps参数,来绑定action,但是可以使用dispatch调到任何一个model中的action?

connect 的 component 就会有 dispatch 的 props 。

Was this page helpful?
0 / 5 - 0 ratings