码迷,mamicode.com
首页 > 其他好文 > 详细

[Functional Programming + React] Provide a reasonable default value for mapStateToProps in case initial state is undefined

时间:2019-04-18 00:53:25      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:some   case   filter   click   undefined   cal   div   efault   return   

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 initial state is undefined

标签:some   case   filter   click   undefined   cal   div   efault   return   

原文地址:https://www.cnblogs.com/Answer1215/p/10727119.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!