alibaba/fish-redux

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里能监听到数据变化, 然后点击热更新之后才会刷新数据

这是我提交的#627

image
我是先判断是否为空,为空才去请求网络,不为空直接使用父组件的state。

你们都没懂我的意思,就是父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 啊哈哈,请忽略。