当前位置: 首页 > 面试题库 >

如何在Redux reducer和动作创建者之间划分逻辑?

上官鸿祯
2023-03-14
问题内容

我已经在减速器中添加了一些逻辑,我认为应该将其添加到Action中并传递下去?

最好的做法是将此类内容放入动作或减速器中吗?

这里的工作示例。

减速器代码:

function Card() {
  this.card = (Math.random()*4).toFixed(0);
}

Card.prototype = {
  getRandom: function(){
    var card;
    //console.log(this.card)
    switch (this.card) {
      case '1':
      card = 'heart';
      break;
      case '2':
      //card = 'diamonds';
      card = 'heart'; // weight the odds abit
      break;
      case '3':
      card = 'club';
      break;
      case '4':
      card = 'spade';
      break;
      default:
      card = 'heart';
      break;
    }
    return card;
  }
}

var dealer = {
  deal: function(){
    var results = [];
    for(var i = 0; i <4; i++){
      var card = new Card();
      results.push(card.getRandom());
    }
    console.log(results);
    return results;
  }
}


const initialState = {
  count: 0,
  data: []
}

function counter (state = initialState, action) {
  let count = state.count
  switch (action.type) {
    case 'increase':
      return Object.assign({}, state, {
        data: dealer.deal(),
        count: state.count+1
      })
    default:
      return state
  }
}

问题答案:

减速器必须是纯净的。当前它不是纯净的。它调用依赖于deal()哪个调用getRandom()Math.random()因而不是纯粹的。

这种逻辑(无论是随机生成还是来自用户输入的“生成数据”)都应在动作创建者中使用。动作创建者并不一定要纯粹,并且可以放心使用Math.random()。该动作创建者将返回一个动作,
一个描述更改的对象

{
  type: 'DEAL_CARDS',
  cards: ['heart', 'club', 'heart', 'heart']
}

reducer只会在状态内部添加(或替换?)此数据。

通常, 从动作对象开始。
它应该以这样的方式描述更改:使用相同的操作对象和相同的先前状态运行化简器应返回相同的下一状态。这就是为什么reducer不能包含Math.random()调用的原因,因为每次调用都是随机的,它们会破坏该条件。您将无法测试减速器。

确定动作对象的外观后(例如,如上),您可以编写动作创建器来生成它,并编写一个reducer来将状态和动作转换为下一个状态。
生成动作的逻辑驻留在动作创建者中,对其做出反应的逻辑驻留在reducer中,reducer必须是纯函数。

最后, 不要在state中使用类 。它们不能直接序列化。你不需要Card上课。只需使用普通对象和数组即可。



 类似资料:
  • 我有一些逻辑,我已经把它放进减速机里了,我在想,应该把它放进行动中,然后传下去? 把这类东西放在动作或减速器中是最佳实践吗? 这里的工作示例。 减速器代码:

  • 了解如何使用 div 标签将内容块居中、创建列效果以及创建不同的颜色区域等。 您可以通过手动插入 div 标签并对它们应用 CSS 定位样式来创建页面布局。div 标签是用来定义网页面的内容中的逻辑区域的标签。可以使用 div 标签将内容块居中,创建列效果以及创建不同的颜色区域等。 如果不熟悉使用 div 标签和 Cascading Style Sheets (CSS) 创建网页,则可以基于 Dr

  • 如何创建并发布分销计划 1、访问【社会化分销】,点击【创建分销计划】进入开启社会化分销页面; 2、设置分销计划的招募标题,上传分销计划介绍图片(包括分销计划的介绍、激励规则等内容,以简洁易懂的形式展示),并设置好此分销计划所获取的线索需存入的线索池。设置完成后,点击右上角【确认】即可保存分销计划; 注: 社会化分销线索可选择存入到线索池或销售线索: 选择存入到【线索池】,适用于您想统一管理和分配通

  • 我试图了解云存储如何与Azure Blob存储协同工作。该用例是一个微服务架构,带有几个API和一个前端,用户可以在其中上传、下载和删除Blob。 我有两种类型的Blob,一种是所有用户都可以访问的个人资料图片和资产,另一种是用户拥有的Blob,只有某些用户可以查看/下载(同一公司的用户、网站管理员…)。 我们有三个概念,我正试图弄清楚目的: 存储帐户,那就是我,Azure帐户持有者 上传blob

  • 问题内容: 我有一个片段,比如,和自定义。我在此适配器中为列表行中的按钮设置。 按下按钮时,我需要通知片段。如何调用此接口? 请帮助。 问题答案: 创建一个新的构造函数和一个实例变量: 制作适配器时,将为实例变量提供适当的引用以进行保存。 要通过点击调用片段,请执行以下操作: 制作时,您还必须将片段传递给适配器。例如 因为this它将引用您的Fragment,现在是。 请记住,在片段更改的方向上,

  • 我试图理解Azure Cosmos DB中物理/逻辑分区和吞吐量可用性之间的关系,并有一个关于每个逻辑分区可用吞吐量的问题。 物理分区的可用吞吐量是在逻辑分区之间平均分配,还是在任何逻辑分区都可以使用物理分区可用吞吐量的0-100%的意义上随机分布? > 在这篇Cosmos DB Conf演示文稿-中,演示者提到物理分区可用的吞吐量均匀地分布在物理分区内的所有逻辑分区中(或者至少我是这样推断的)。