在哪里转换Redux状态以在UI中使用

时间:2019-02-21 16:57:51

标签: reactjs design-patterns redux react-redux

我有一个“事件”列表:

Private Function GetDuplicatitions(array As String()) As String
    Dim result = ""
    For Each item In array
        If IsInList(result, item) Then Continue For
        If HasDuplications(array, item) Then result &= item & ","
    Next
    Return result
End Function

Private Function HasDuplications(array As String(), text As String) As Boolean
    Dim count = 0
    For Each item In array
        If item = text Then count = count + 1
        If count > 1 Then Return True
    Next
    Return False
End Function

Private Function IsInList(list As String, item As String) As Boolean
    For Each duplicated In list.Split(",")
        If item = duplicated Then Return True
    Next
    Return False
End Function

我在componentDidUpdate中获取这些事件,然后将它们作为道具形式传递给我的组件,即redux connect mapStateToProps-它们来自“选择器”-getEvents。

我想将它们显示在react-big-calendar上,该日历需要这种格式-

Dim list = {"a", "a", "b", "c", "c"}
Label7.Text = GetDuplicatitions(list)

在哪里将它们从我的对象转换为react-big-calendar对象?

这似乎必须在组件中发生,因此,如果我切换到另一个日历库,我的redux代码将保持不变。

是否有执行此操作的标准模式?我应该直接在我的render方法中这样做吗?

{
 id: 1,
 description: "Did something",
 date: <date>, 
 eventTypeId: 1
}

或者有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您应该编写一个选择器并在该选择器中转换这些事件,而不是在组件中进行转换。每当您以后想要更改为其他库时,只需更改一个选择器中的逻辑,而不必在每个组件中进行更改

const mapStateToProps(state, props) {
    const events = getEvents(state, props);
    return {
       events
    }
}

...

const getEvents = (state, props) => { // this can be a reselect selector as well
      // transform logic here
      return events;
}

答案 1 :(得分:1)

现在无法在React文档上找到此方法,但是从性能的角度来看,最好将render方法保持尽可能简单,并且不要在其他逻辑上进行重载。 考虑到您的组件会因为其他道具的更改而重新呈现-每次它将重新计算bigCalEvents

这就是为什么最好以期望数据的格式将数据传递到组件。

我建议您在mapStateToProps函数中进行此处理。另外,如果您使用的是reselect库,则可以记住结果以避免重新提交。