Javascript 在reducer中向redux存储添加函数是一种反模式吗?

Javascript 在reducer中向redux存储添加函数是一种反模式吗?,javascript,reactjs,redux,Javascript,Reactjs,Redux,假设我有一个组件连接到redux存储。在这个商店里,有一个对象列表。例如这样的事情: ReduxStore: { dataList: [ {name:'bla'}, {name:'blub'}, ] } ReduxStore: { dataList: { data:[ {name:'bla'}, {name:'blub'} ], isNameAvailable: (name) => {/*

假设我有一个组件连接到redux存储。在这个商店里,有一个对象列表。例如这样的事情:

ReduxStore: {
    dataList: [
      {name:'bla'},
      {name:'blub'},
    ]
}
ReduxStore: {
   dataList: {
     data:[
      {name:'bla'},
      {name:'blub'}
     ],
     isNameAvailable: (name) => {/* search for name */}
   }
}
在reducer中创建并添加过滤函数以创建如下内容,实际上是一种反模式:

ReduxStore: {
    dataList: [
      {name:'bla'},
      {name:'blub'},
    ]
}
ReduxStore: {
   dataList: {
     data:[
      {name:'bla'},
      {name:'blub'}
     ],
     isNameAvailable: (name) => {/* search for name */}
   }
}

它工作得很好,但我不确定这是否是预期的方式。

这是一种反模式,因为您的存储只关心数据,而不关心计算。一旦开始向存储添加函数,就无法序列化存储中的数据

然而,将这些类型的助手函数拉出来并将它们转换为独立的实用程序选择器是非常简单的,您可以使用它们来实现同样的功能

function isNameAvailable(store, name) {
  /* search for `name` in `store` */
}
现在,该功能独立于存储区工作,您可以将它们分开进行测试


从这里,您可以了解一下,哪些功能允许您将isNameAvailable函数转换为缓存选择器,这意味着您只需要在存储中的相应数据发生更改时重新计算。

这是一种反模式,因为您的存储只关心数据,而不关心计算。一旦开始向存储添加函数,就无法序列化存储中的数据

然而,将这些类型的助手函数拉出来并将它们转换为独立的实用程序选择器是非常简单的,您可以使用它们来实现同样的功能

function isNameAvailable(store, name) {
  /* search for `name` in `store` */
}
现在,该功能独立于存储区工作,您可以将它们分开进行测试

从这里,您可以了解哪些功能允许您将isNameAvailable函数转换为缓存选择器,这意味着您只需在存储区中的相应数据发生更改时重新计算即可。

来源:

减速机保持纯净是非常重要的。在减速器内不应执行的操作:

改变其论点; 执行API调用和路由转换等副作用; 调用非纯函数,例如Date.now或Math.random。 因此,我认为如果您想声明一个过滤函数isnameavable,在我看来,您有两个选项:

使用“连接”功能进行筛选

// the solution of connect 

import React, { Component } from 'react';
import { connect } from 'react-redux';

const App = () => (
  <div>the example</div>
);

function isNameAvailable(state) {
  // your code
}

function mapStateToProps(state) {
  return isNameAvailable(state)
}

module.exports = connect(mapStateToProps)(App);
声明正在运行的筛选器函数

根据我的经验,我认为第一个更好。我希望这能对您有所帮助。

来自:

减速机保持纯净是非常重要的。在减速器内不应执行的操作:

改变其论点; 执行API调用和路由转换等副作用; 调用非纯函数,例如Date.now或Math.random。 因此,我认为如果您想声明一个过滤函数isnameavable,在我看来,您有两个选项:

使用“连接”功能进行筛选

// the solution of connect 

import React, { Component } from 'react';
import { connect } from 'react-redux';

const App = () => (
  <div>the example</div>
);

function isNameAvailable(state) {
  // your code
}

function mapStateToProps(state) {
  return isNameAvailable(state)
}

module.exports = connect(mapStateToProps)(App);
声明正在运行的筛选器函数

根据我的经验,我认为第一个更好。我希望这能帮助你