[Functional Programming + React] Provide a reasonable default value for mapStateToProps in case init

Posted answer1215

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Functional Programming + React] Provide a reasonable default value for mapStateToProps in case init相关的知识,希望对你有一定的参考价值。

For example we have a component, it needs to call ‘react-redux‘ connect function.

import { compose, curry, option, propPath } from ../js/helper

const FilterButton = ({ active, onClick }) => {
    const classes = classnames(filterButton, {
        filterButton--active: active
    })
    return <Button className={classes} onClick={onClick} icon={faFilter} />
}

FilterButton.defaultProps = {
    active: true,
    onClick: Function.prototype
}

FilterButton.propTypes = {
    active: PropTypes.bool,
    group: PropTypes.string.isRequired,
    onClick: PropTypes.func
}

const mapStateToProps = (state, ownProps) => ({
    active: state.ui.filterGroups[ownProps.group]
})

export default connect(mapStateToProps)(FilterButton)

 

For the hightlighted part, there can be many possible reason for it to go wrong. We can use Maybe to provide a reasonable default value.

First, the inital State is:

const data = {
    nextId: 4,
    todoFilter: SHOW_ALL,
    todos: [
       ...
    ],
    ui: {
        filterGroups: {
            status: false
        }
    }
}

If the highlighted part is undefined, we still want it works.

 

import { compose, curry, option, propPath } from crocks
...

const activeGroup = curry(group =>
    compose(
        option(FilterButton.defaultProps.active),
        propPath([ui, filterGroups, group])
    )
)
const mapStateToProps = (state, ownProps) => ({
    active: activeGroup(ownProps.group, state)
})

export default connect(mapStateToProps)(FilterButton)

 

--Full code--

import React from react
import PropTypes from prop-types
import { connect } from react-redux
import Button from ./controls/Button
import classnames from classnames
import { faFilter } from @fortawesome/free-solid-svg-icons

import { compose, curry, option, propPath } from crocks

const FilterButton = ({ active, onClick }) => {
    const classes = classnames(filterButton, {
        filterButton--active: active
    })
    return <Button className={classes} onClick={onClick} icon={faFilter} />
}

FilterButton.defaultProps = {
    active: true,
    onClick: Function.prototype
}

FilterButton.propTypes = {
    active: PropTypes.bool,
    group: PropTypes.string.isRequired,
    onClick: PropTypes.func
}

const activeGroup = curry(group =>
    compose(
        option(FilterButton.defaultProps.active),
        propPath([ui, filterGroups, group])
    )
)

const mapStateToProps = (state, ownProps) => ({
    active: activeGroup(ownProps.group, state)
})

export default connect(mapStateToProps)(FilterButton)

 

以上是关于[Functional Programming + React] Provide a reasonable default value for mapStateToProps in case init的主要内容,如果未能解决你的问题,请参考以下文章

[Functional Programming ADT] Debug a Functional JavaScript composeK Flow

Functional programming

Functional Programming.

[Functional Programming] Monad

Functional programming-函数式编程

python learning Functional Programming.py