component 无法更新的问题
Closed this issue · 16 comments
Home page有两个组件component A和component B,component B里有自己的网络请求,请求成功后执行了reducer,数据已经放在component B的state里,但是component B的state在conn里可能被重新赋值为null,造成component B的view重新执行buildView的时候这个值还是null的,这个该如何操作,也就是component B里的数据来自于自己的网络请求,不是来自自于home Page,我该如何获取到正确的数据呢
有代码么?可能是conn没写对?
@dddrop 意思是这样的,component B的数据是由自身发起网络产生的,然后改变component B里State里的值,这个值不是由page传过来的,这样就更新不了,这个state里的值根本就没写在conn里
如果有代码片段可能能帮上忙。
试下热更新是否能刷新数据, 我的也是component数据不刷新,在conn里能监听到数据变化, 然后点击热更新之后才会刷新数据
你们都没懂我的意思,就是父page里state没有定义子state的数据,子state里的数据是由自己控制,当走到conn的get里,由于父state没传给子state数据,造成子state默认是null的,所以这样数据是不对的。从fish-redux得到了结果,数据流向必须由父component流给component,如果子state自己产生的话,有两种方式:
1、如果要保持独立的state, 那么就它应该有独立的store。
2、如果要保持独立的props,可以参考LocalState。
fish-redux 的设计上决定了需要将 Component 的 state 连接到 Page。
当然,对 Component 的更新可以有 Component 自身来完成。
如下:父的 State 持有 Component 的 State,但不做任何修改。如果子 State 有不想暴露的 Properties 的话,加 _
隐藏就好。
// Home
class HomeState implements GlobalBaseState, Cloneable<HomeState> {
HomeNewsState newsState;
// CustomTheme theme;
...
}
class HomeC2HomeNews extends ConnOp<HomeState, HomeNewsState> {
@override
void set(HomeState state, HomeNewsState subState) {
state.newsState = subState;
}
@override
HomeNewsState get(HomeState state) {
return state.newsState;
// return state.newsState..theme = state.theme;
}
}
...
不知道这个回答能帮到你么?
@hasonguo
@override HomeNewsState get(HomeState state) { return state.newsState= state; }
这里HomeNewsState还是home保存的state,你更新的state通过set赋值过去了是吧?
@hasonguo 不好意,截取代码片段的时候弄错了(已修改)。
@override
HomeNewsState get(HomeState state) {
return state.newsState;
}
直接返回 substate 的值。
我现在也理解了,就是想要保留component里私有状态,我认为conn应该可以conn父组件的一部分properties 给子组件,而子组件自己的properties更新后只刷新子组件的view,完全和父组件无关。
是否在conn get的时候可以 clone一份子组件的state,然后我们按照需要更新。
目前能实现的只有shouldUpdate
或者单独实现StatefulWidget,没必要完全局限于fr的框架内。
如果子 State 有不想暴露的 Properties 的话,加
_
隐藏就好。
@dddrop 如果是这样的话,在 state 里面定义的属性,在 effect view 和 reducer 都不能用,这样的属性有什么用呢?
我是将 state 和 reducer,effect 定义在一个文件里面的。_
是 fileprivate,所以。。。
@ganlanshu0211 啊哈哈,请忽略。