根据 Redux 状态更改组件的布局

2024-01-03

我正在用 React 开发一个课程安排应用程序,我用它作为学习 redux 的机会。我当前正在设计一个浏览菜单(作为浏览组件实现),它在加载时显示大学中的学校列表。当用户单击其中一所学校时,它会显示该学校内的科目列表。但是,我希望学校显示为网格(两列),并且我希望科目显示为列表(一列)。他们可能还需要将不同的道具提供给浏览组件。

我该怎么做呢?目前,我有一个 Browse 组件和一个 BrowseReduxContainer 组件。 BrowseReduxContainer 组件使用react-redux 中的connect()、mapStateToProps 和mapDispatchToProps 来填充Browse 的props。当我只是显示学校时,这效果很好,但我不确定如何根据州修改浏览的布局。我应该根据状态给 connect() 不同的组件吗?或者我应该在浏览组件中实现逻辑来检查道具并相应地显示网格/列表?或者完全是别的什么?

动作.js

export function showSubjects(schoolId) {
  return {
    type: 'SHOW_SUBJECTS',
    schoolId
  };
}

浏览.js

const initialState = {
    currentView: 'schools',
    schools: [{id: 'AAAA', name: 'aaaa'}, {id: 'BBBB', name: 'bbbb'}],
    subjects: [{id: 'CCC', name: 'ccc'}, {id: 'DDD', name: 'ddd'}]
};

function browse(state = initialState, action) {
  switch (action.type) {
    case 'SHOW_SUBJECTS':
      return {
        ...state,
        currentView: 'subjects'
      };
    default:
      return state;
  }
}

export default browse;

BrowseReduxContainer.jsx

import { connect } from 'react-redux';
import { showSubjects } from '../actions/actions';
import Browse from '../components/Browse.jsx';

function propsFilter(state) {
  switch (state.currentView) {
    case 'schools':
      return state.schools;
    case 'subjects':
      return state.subjects;
    default:
      throw new Error(`No such view: ${state.currentView}`);
  }
}

const mapStateToProps = (state) => ({
  schools: propsFilter(state)
});

const mapDispatchToProps = (dispatch) => ({
  showSubjects: (schoolId) => {
    dispatch(showSubjects(schoolId));
  }
});

const BrowseReduxContainer = connect(mapStateToProps, mapDispatchToProps)(Browse);

export default BrowseReduxContainer;

浏览.jsx

import React from 'react';
import RaisedButton from 'material-ui/RaisedButton';

const Browse = (props) => (
  <div>
    {props.schools.map((school) => (
      <RaisedButton key={school.id} label={school.name} onClick={props.showSubjects(school.id)} />
    ))}
  </div>
);

export default Browse;

其他相关文件,如有需要,可以在这里查看:https://github.com/Joonpark13/serif.nu/tree/feature/browse https://github.com/Joonpark13/serif.nu/tree/feature/browse

UPDATE:此时我最好的猜测是拥有不同的视图组件及其自己适当的道具(可能称为 BrowseA 和 BrowseB),并根据状态连接适当的组件。我想将此逻辑包含在 BrowseReduxContainer 内的 mapDispatchToProps 中,但后来我意识到 mapDispatchToProps 函数不将状态作为参数。我很乐意提供任何建议!


connect https://github.com/reactjs/react-redux/blob/master/docs/api.md#connectmapstatetoprops-mapdispatchtoprops-mergeprops-options在你的子组件上声明

Using connect放在子组件上有以下优点:

  • 你的父组件不需要担心connect即使父级本身没有使用该 prop,也会获取其子级所需的所有 props。

  • 子组件变得更加可重用,并且易于维护。

  • 避免盲目地将道具从父母传给孩子。如果Child需要大量的 props,人们不想显式地仅传递所需的 props,而是倾向于在父级内部执行此操作:<Child {...this.props} />.

    Use connect并且您知道您的组件正在获得什么。

  • 你不必重复propTypes父级和子级的定义。


将业务逻辑与视图分开:

业务逻辑是:

  • 基于来自 API 或用户输入的数据的任何计算
  • 数据标准化和格式化
  • 以小的增量或函数完成,以便它们易于扩展、可组合和可维护
  • 在多个视图中重用业务逻辑功能。

视图应该:

  • 从状态和/或业务逻辑功能中提取准备好的数据

  • 根据数据显示或隐藏 UI

  • 简化 UI 组件,使其更小、可重用且易于维护

  • 通过获取道具connect来自业务逻辑功能。


什么是业务逻辑函数?

业务逻辑函数是输入数据和输出修改后的数据的小型可重用函数。如果它们很小,则可以轻松地重用和修改。业务逻辑功能应该是纯净的。因为业务逻辑功能往往是reused,当它们工作得最好时memoized https://en.wikipedia.org/wiki/Memoization。在某些语言中,这些被称为getters or 选择器.

为了简化记忆,您可以使用reselect https://github.com/reactjs/reselect图书馆。它非常简单,因为它只做两件事:记忆和可重用性。请查看官方 API,了解有关其如何执行此操作的更多信息。

优点:

  • 业务逻辑位于易于调试、增强、维护、阅读的小函数中
  • 业务逻辑函数被记忆,因此重复调用性能良好
  • 业务逻辑是分离的,因此可以在应用程序中重复使用
  • 由于主要操作经过高度优化,因此应用程序速度更快
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据 Redux 状态更改组件的布局 的相关文章

随机推荐

  • 如何通过php脚本执行.exe程序

    我想使用 php 脚本在我的 Apache 服务器上执行 exe 文件 程序如下 用户来了 填写了一个 html 表单 它转到 php 脚本 php脚本执行name exe file php 打印输出name exe页面上的文件 我通常从
  • 由于 WebSecurityConfigurerAdapter 已弃用,Spring 获取 AuthenticationManager 实例变得复杂

    Spring 最近弃用了 WebSecurityConfigurerAdapter 这似乎不是最明智的举动 因为新方法的文档记录极少 而且 WebSecurityConfigurerAdapter 基本上无处不在 现在我尝试向安全过滤器链添
  • 由于“检测到堆栈损坏:已中止”而崩溃

    我最近收到用户的投诉 称我的应用程序崩溃了 我从用户的错误日志中提取了以下内容 并能够了解问题发生的原因 12 17 10 31 12 446 I PLAYLIST 3158 PreparePlaylist 12 17 10 31 12 4
  • C++ 标准中临时绑定到成员生命周期语句的意义是什么?

    In 这个问题 https stackoverflow com q 4721136 57428 user 快乐米塔尔 https stackoverflow com users 317283 happy mittal引用 C 03 标准第
  • 将一个矩阵的行与另一个矩阵的行匹配,无论列顺序如何?

    我有两个矩阵 我需要查找一个矩阵中的两列集是否出现在另一个矩阵中 而不考虑顺序 A B B A 作为示例 这里有两个矩阵 X lt matrix c 23 33 4 21 5 27 47 39 37 8 30 42 59 63 53 50
  • Android Studio 更新至 1.0 损坏 MultiDex

    您好 有类似的错误 例如重复条目 失败 构建失败并出现异常 什么地方出了错 任务 eBooks packageAllDebugClassesForMultiDex 执行失败 java util zip ZipException 重复条目 a
  • 在 HttpClient 上使用 DelegatingHandler 和自定义数据

    考虑到使用 HttpClient 的众所周知的困境和问题 即套接字耗尽和不尊重 DNS 更新 最好的做法是使用 IHttpClientFactory 并让容器决定何时以及如何利用 http 池连接效率 这一切都很好 但现在我无法在每个请求上
  • React 上下文 useReducer 未正确更新

    我在使用减速器时遇到问题React语境 在buttonbar js 有两个按钮应该更新状态 状态将通过过滤当前的数据来更新 正在单击按钮 我没有收到任何错误 但它也没有执行任何操作 我认为问题出在减速机上 上下文 js import Rea
  • 为什么 std::pair 公开成员变量?

    From http www cplusplus com reference utility pair http www cplusplus com reference utility pair 我们知道std pair有两个成员变量 fir
  • 我们可以在 NodeJ 中使用多个 cpu 核心和工作线程来实现并行处理吗?

    我知道 cluster 和 child process 可以使用CPU的多个核心 这样我们就可以实现真正的并行处理 我还知道异步事件循环是单线程的 所以我们只能实现并发 我的问题是关于worker threads 假设我的电脑有 4 核 C
  • Guice Servlet 的简单示例

    我不知道如何继续一个简单的示例 阅读文档后 我完成了以下操作 设置 guiceFilter 创建了一个注入器并实例化了一个新的 ServletModuleGuiceServletContextListener并将监听器添加到 web xml
  • Python - 按四分之一间隔舍入

    我遇到了以下问题 给出各种数字 例如 10 38 11 12 5 24 9 76 是否存在一个已经存在的 内置 函数来将它们四舍五入到最接近的 0 25 步长 例如 10 38 gt 10 50 11 12 gt 11 00 5 24 gt
  • 安排 Rails 任务在特定时间运行

    我目前正在创建一个 Rails 应用程序 并想了解如何安排某些任务在特定时间运行 例如管理员希望在早上 8 00 向用户发送电子邮件 并且不想为了发送该电子邮件而早起 因此 他 她希望安排在那时发送电子邮件的任务 那么 有没有一种方法 或者
  • 如何将kinesis视频流存储到S3存储桶中?

    我正在通过 kinesis video Streaming 将实时视频流发送到亚马逊控制台 现在我想将其存储到亚马逊 S3 中 如何存储到S3请详细说明 谢谢 Amazon Kinesis Video 不会 开箱即用 地将视频存储在 S3
  • 如何使用 gsap 为camera.lookAt制作动画?

    camera lookAt myObject 将立即将 Three js 相机旋转到给定的对象 我想使用 gsap 来制作这个旋转的动画 我使用 gsap 来动画相机位置的变化没有问题 但下面的相机旋转代码没有任何作用 const targ
  • ASP.NET 中 mysql 的 Membership.Provider 问题

    使用 MVC4 同步到 mysql 服务器 通过更改 machine config 是否成功并成功使用 ASP net 配置工具创建用户 但是 当我使用使用该工具创建的用户名 并且位于数据库中 登录时 我收到此错误 System Inval
  • 读取应用程序文件夹外的单独 web.config 文件

    我需要阅读web config文件 位于应用程序文件夹之外 位于任何其他目录中 我尝试了这段代码 string filePath C Users Idrees Downloads New folder Web config Configur
  • jQuery 性能、.css 或 addClass

    我有一个很大的 jQuery 代码 我正在考虑我的函数的速度性能 单击某个元素 鼠标按下 时 我需要指定图像作为背景 我可以通过两种方式做到这一点 element li class css background someimageURL o
  • 从自定义分布生成随机数

    我正在尝试从自定义分布生成随机数 我已经发现了这个问题 从 任意 连续概率分布进行模拟 https stackoverflow com questions 23570952 simulate from an arbitrary contin
  • 根据 Redux 状态更改组件的布局

    我正在用 React 开发一个课程安排应用程序 我用它作为学习 redux 的机会 我当前正在设计一个浏览菜单 作为浏览组件实现 它在加载时显示大学中的学校列表 当用户单击其中一所学校时 它会显示该学校内的科目列表 但是 我希望学校显示为网