-
Notifications
You must be signed in to change notification settings - Fork 3.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于dva实际应用的一些经验以及疑惑 #886
Comments
loading有这个啊:https://github.com/dvajs/dva-loading 不是只能在app级别的,还可以在model和effect级别 |
额,才注意到 loading还有个effects参数, effect级别的loading确实更强大。不过,callWithloading, callWithConfirmLoading, callWithSpinner基本也能满足我们的需求,就是命名太长了.. |
有demo分享吗 |
@laketea 厉害了 |
@zuiidea 不是啊,loading可以细化在某个effect上面,然后你业务上真实的loading还可以是几个loading的组合: loading.modelA.effectA || loading.modelB.effectB |
另外,直接修改数据的这个: yield update({ users }) 这是一个很纠结的事情,这里少一步put,可能在调试的时候devtools里面损失一些便利,这个要权衡一下。不过,鉴于每个effect都是由dispatch的action转换而来,在这些effect里面去update,流程上是没有问题的。 |
@xufei |
request, 我是用axios替代官方的, 当后端返回一个代表失败code时, throw一个异常, 然后通过 |
通过onError来捕获request错误,无法做更精确的控制吧,Error对象无法携带更复杂的数据. |
@xufei yield update({ users })
// 等同于
yield put({ type: 'updateState', { users } }) |
@laketea 九成以上的请求都是类似的, Error能携带后端返回的错误描述具体内容已经足够了. 需要特殊处理可以在effect自己catch |
@laketea 能开源你们的脚手架么,想看看model.extend怎么写的 |
比较喜欢 subscriptions 跟 form 的改动,赞一个 |
@sbyps model 的本质是 JSON对象,model.extend 能实现扩展合并即可。我印象里面 dva 官方是可以model 继承的 |
@zjxpcyc 能开源分享一下么,现在我也在封装model和Form呢; |
@sbyps 我没做封装, @laketea 他们的封装就很棒。 |
@zjxpcyc 谢谢,之前没看到这个方法; |
@sbyps 这两天我整理一个demo出来吧。。 |
挺好的! 特别是listen这一块,之前写正则表达式那叫一个 |
12天过去了。。。 |
@laketea 表单的封装是真的不错, 能把封装的方法共享一下更好 |
@linyongping @zuiidea @sbyps 最近一阵太忙了... 已提供 |
@laketea 很多值得借鉴和学习的,赞 |
其实利用 function prefixType(type, model) {
const prefixedType = `${model.namespace}/${type}`
if (
(model.reducers && model.reducers[prefixedType]) ||
(model.effects && model.effects[prefixedType])
) {
return prefixedType
}
return type
}
function createEffects(sagaEffects, model) {
function put(type, payload) {
let action = type
if (typeof action === 'string') {
action = {
type: action,
payload,
}
}
return sagaEffects.put({ ...action, type: prefixType(action.type, model) })
}
function update(payload) {
return put('updateState', payload)
}
return { ...sagaEffects, put, update }
}
const dvaEnhancer = {
onEffect: (effect, sagaEffects, model) =>
function* effectEnhancer(action) {
yield effect(action, createEffects(sagaEffects, model))
},
}
app.use(dvaEnhancer) |
这里面用到了一个trick就是自己提供 |
@sbyps dva-model-extend @AsceticBoy model的划分,我个人认为一类是面向资源,一类是面向视图层;model独立出来,一是为了方便维护,二是为了方便共享,异步数据管理和跨组件共享的数据都可以放在model里;关于 |
@AsceticBoy 放connect里面做么? |
可以在 |
在subscriptions判断路由感觉非常不方便,比如写的router是 /user/:id 这样的,我只能拿到一个pathname,而且需要自己写正则去判断是否为想要的path,判断逻辑也很复杂(比如,如果你在routerRedux进行跳转但是没有写'/a' 只写 'a',最后获取到的这个pathname是没有 '/'的,并且,合法的路径也可以在最后多一个斜杠,这也需要判断),反正获取这个:id很麻烦,但是如果在组件componentDidMount后在props里拿到params就可以非常轻松的拿到:id,求个使用subscriptions的正确姿势 |
这种form封装和extjs的封装类似? |
从开始学习dva到引入到实际项目中也有几个月的时间,下面分享一下实际的经验,另外也有一些比较含糊或者疑惑的地方,看看大家有没有有些好的思路。
dva整体构架比较清晰,但是实际使用的时候,还是需要做很多处理。
dva model扩展
在我们的基础库中,实现了Model.extend方法,所有的model都通过这个方法来创建, extend具体对以下几个方面进行了扩展.
state
根据我们的业务特点(主要为管理系统),每个model我们都默认添加了loading, confirmLoading, spinner属性
subscriptions
subscriptions中对路由的监听 写法太过繁琐,特别是在包含参数的情况下。我们扩展了实现了listen方法
effects扩展
dva中处理loading状态非常繁琐,而dva提供的全局loading对我们业务并不适用,因为往往一个model中,有些call请求需要loading,有些call请求又不需要loading,所以我们对effects中的saga函数进行了扩展
如果发送ajax请求,需要处理相关的状态,就可以使用上面的方法,如果不需要就使用原始的call方法, 使用开发中可以灵活选择.
另外,在我们的业务中,call请求成功或者失败后,往往需要弹出对应的业务提示框(消息内容有时候不是由后端提供),故我们在上面的函数中,都提供额外的参数,支持请求结果的消息框处理。
effects中经常需要需要更新state,但是往往又不想为每次修改都命名一个reducer函数,所以扩展了update方法,调用updateState reducer来更新state
reducers扩展
为了配合effects中的扩展,我们默认实现了如下方法
showLoading,hideLoading... 等加载状态控制方法
updateState 直接更新state数据
resetState 重置state数据
request 扩展
fetch在实际项目中用使用,实在太过鸡肋,我们在fetch的基础上封装了Http类,实现了简单的中间件机制,方便各个项目使用,并且实现了一些常见的中间件(token中间件,统一错误弹框中间件等)
antd form扩展
antd form写法 个人觉得实在太过繁琐,一个带表单验证的输入框,往往需要FormItem & getFieldDecortor & Input 三层结构,而且混合着jsx以及js的语法.
为了简化form相关的代码,我们重新定义了field属性结构,并且提供了HForm 以及HFormItem组件。
HForm 主要应用与一些简单的form表单,不需要太多的交互
HFormItem 则是form中每一项输入框,用于复杂布局/交互的form中
脚手架
参考dva-cli,我们实现了一个自己的脚手架,支持更丰富类型的模版(curd页面等常见页面模版)
The text was updated successfully, but these errors were encountered: