在Redux状态下使用原型函数存储对象

时间:2016-04-25 20:37:39

标签: javascript reactjs state redux

在州内存储课程被认为是不好的做法吗?我已经读过,状态应该是易于序列化的对象,并且类会破坏这种约定。

我正在创建一个Web应用程序,它使用react / redux和一组支持模型来收集用户的信息。

例如,我有以下模型:

class Person {
  constructor(params = {}) {
    this.firstName = params.firstName || '';
    this.lastName = params.lastName || '';
    this.gender = params.gender || '';
    this.dateOfBirth = params.dateOfBirth || '';
    this.stateOfResidence = params.stateOfResidence || '';
    this.email = params.email || '';
  }
  validateField(args) {
    // remove for brevity
  }
  valid(args) {
    // remove for brevity    
  }
}

通过发出以下actionCreator将对象添加到商店:

export function addPerson(args = {}) {
  return (dispatch) => {
    dispatch({
      type: 'ADD_PERSON',
      obj: new Person(args)
    });
  };
}

适当的人员减少器将其粘贴到状态,以便我可以从应用程序的其余部分获取它。

这样当我从状态中抓取对象时,我可以运行它的验证和有效的原型函数,以查看模型是否有效并做出适当的反应。

这是否会违反/ redux惯例?解决这个问题的另一种方法是什么?使用上述方法可能遇到的潜在问题是什么?现在不能预见任何问题...但我也没有反应/减少(~4个月)的经验

修改:

我应该补充一点,我通过reducer改变对象状态。我小心不要在应用程序的其他地方改变状态。

2 个答案:

答案 0 :(得分:1)

是的,它通常被认为是一种反模式,因为它打破了做时间旅行调试(Redux的核心卖点之一)等功能。有关详细信息,请参阅http://redux.js.org/docs/FAQ.html#organizing-state-non-serializable上的Redux常见问题解答。

如果您希望在普通数据上拥有更多类似于对象的外观,则可能需要查看https://github.com/tommikaikkonen/redux-orm之类的内容。

答案 1 :(得分:0)

所以我认为我的代码可以帮助某人找到一种方法,可以通过困难的函数来解决将转换类转换为函数的问题,不支持原型,让我的一些代码可以对其进行修复并且很容易

import React from 'react'
import PropTypes from 'prop-types'

const Link = ({ active, children, onClick }) => (
    <button
       onClick={onClick}
       disabled={active}
       style={{
           marginLeft: '4px',
       }}
    >
      {children}
    </button>
)

Link.propTypes = {
  active: PropTypes.bool.isRequired,
  children: PropTypes.node.isRequired,
  onClick: PropTypes.func.isRequired
}

export default Link