切换无状态反应组件数组的可见性

2024-01-24

我试图简单地映射从 api 返回的一些数据,并为每个返回的对象创建一个无状态组件。我希望能够单击任何组件来切换其其余数据的可见性。

我尝试了多种方法来做到这一点,但一直碰壁,我还搜索了堆栈溢出,但似乎找不到答案。

我已经通过使它们成为单独的类组件来使其工作,但是对于切换功能来说似乎有很多不必要的代码。

预先感谢您提供的任何帮助或见解,这是我目前所拥有的内容的快速细分。

澄清一下,这是一个简单的应用程序,供我学习如何使用 React 和外部 api,它没有使用 redux。

获取处于类组件状态的用户

class PersonList extends Component {
  constructor(props) {
    super(props);
    this.state = {
      resource: []
    };
  }

  async componentDidMount() {
    let fetchedData = await API_Call("people");
    this.setState({ resource: fetchedData.results });
    while (fetchedData.next) {
      let req = await fetch(fetchedData.next);
      fetchedData = await req.json();
      this.setState({
        resource: [...this.state.resource, ...fetchedData.results]
      });
    }
  }
}

然后映射结果并为每个结果渲染一个组件

render() {
  const mappedPeople = this.state.resource.map((person, i) => (
    <Person key={i} {...person} />
  ));
  return <div>{mappedPeople}</div>;
}

我是否可以使每个人组件成为无状态组件,并且能够单击它并显示其余数据?这是我目前拥有的。

class Person extends Component {
  constructor(props) {
    super(props);
    this.state = {
      visibility: false
    };
  }
  toggleVisible = () => {
    this.setState(prevState => ({
      visibility: !prevState.visibility
    }));
  };
  render() {
    return (
      <div>
        <h1 onClick={this.toggleVisible}>{this.props.name}</h1>
        {this.state.visibility && (
          <div>
            <p>{this.props.height}</p>
          </div>
        )}
      </div>
    );
  }
}

再次提前感谢您的任何见解或帮助!


你可以保留一个对象visible在您的父组件中,该组件将具有表示人员索引的键和表示该人员是否可见的值。通过这种方式,您可以在这个单个对象中切换人员的索引,而不是使用有状态的子组件。

Example

class PersonList extends Component {
  constructor(props) {
    super(props);
    this.state = {
      resource: [],
      visible: {}
    };
  }

  // ...

  toggleVisibility = index => {
    this.setState(previousState => {
      const visible = { ...previousState.visibile };
      visible[index] = !visible[index];
      return { visible };
    });
  };

  render() {
    const mappedPeople = this.state.resource.map((person, i) => (
      <Person
        key={i}
        {...person}
        visible={this.state.visible[i]}
        onClick={() => this.toggleVisibility(i)}
      />
    ));
    return <div>{mappedPeople}</div>;
  }
}

const Person = (props) => (
  <div>
    <h1 onClick={props.onClick}>{props.name}</h1>
    {props.visible && (
      <div>
        <p>{props.height}</p>
      </div>
    )}
  </div>
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

切换无状态反应组件数组的可见性 的相关文章

  • 如何在光标下的所有元素上调用 mouseover?

    我有一个网络应用程序 每次单击时都会创建一个点 见下文 当我将鼠标悬停在一堆点上时 我希望光标下的每个点都会触发 mouseover 或 mouseenter 事件 然而 只有一个事件被触发 即堆栈 顶部 的点的事件 当鼠标移动到一堆多个点
  • React-i18next 每个组件的翻译

    我正在使用react i18next 事情是它期望
  • 使用闭包和自调用函数制作计数器

    我想知道为什么这段代码不起作用 var uniqueInteger function var counter 0 return function return counter console log uniqueInteger 0 cons
  • 如何获取 RxJSSubject 或 Observable 的当前值?

    我有 Angular 2 服务 import Storage from storage import Injectable from angular2 core import Subject from rxjs Subject Inject
  • 使用 NodeJS 让 Discord 机器人发送带有消息的图片

    我有几张照片 全部在 imgur 上 带有直接图像链接 格式 https i imgur com XXXXXX jpg https i imgur com XXXXXX jpg 以及用 NodeJS 制作的 Discord 机器人 我发送这
  • 在 JavaScript 中比较表单中的两个数字

    当我尝试比较不同的数字时 数字发生变化 但文本部分保持不变 这只发生在较大 较小的情况下 而不会发生在 NaN 或相等的情况下 这是我的代码 function check var a document getElementById a va
  • 提交前验证表单(比检查空字段更复杂)

    我有一个包含时间输入的表单 具体来说 开放时间和结束时间 当按下提交按钮时 它会转到一个 php 页面 其中这些输入将添加到数据库中 在允许提交表单之前我想检查一些事情 例如 我想确保开始时间早于 小于 结束时间 这是表格 Opens
  • 使用 Javascript / Jquery 的本地存储(不使用 HTML5)

    我想在 javascript 或 jquery 中复制本地存储概念 类似于 HTML5 但不幸的是我不知道如何开始 任何人都可以建议如何使用 javascript 或 jquery 实现本地存储 不使用 HTML5 这是一个有点愚蠢的差事
  • 在 vue.js 模板中包含外部脚本

    我是 Vue js 和 web pack 的新手 所以我决定使用 vue cli webpack 来构建初始应用程序 我试图包含一个外部脚本 例如组件 不需要的模板中 但是 Vue 警告这是不允许的 我的 index html 文件与最初生
  • setInterval 内的返回值

    我想在 setInterval 内返回一个值 我只想以一定的时间间隔执行一些操作 这就是我尝试过的 function git limit var i 0 var git setInterval function console log i
  • 元素中优先考虑 ngclick 而非 nghref

    tl dr 如何强制 Angular 只执行 ngclick 指令 a 元素而不清空 删除href 我的网站在某些元素上有一些自定义行为 模式打开 位置栏更新等 但对于 SEO 索引我also需要它成为一个 a 元素与href包含有效链接的
  • 如何在 angularjs 中修剪()字符串?

    有角度特定的方法吗 如果没有 我应该使用内置的jquery 来做到这一点吗 如果我应该使用内置的jquery 如何在不使用 的情况下访问trim 函数 或者这是必要的 编辑 是的 我知道 str trim 对不起 我需要这个才能在 IE 8
  • RTCDataChannel发送方法不发送数据

    我的 RTCDataChannel 遇到一个奇怪的问题 我正在对 WebRTC 进行一些研究 并且已经可以进行 WebRTC 音频 视频聊天 现在我想使用 RTCDataChannel 添加文本聊天和文件共享 我已经像这样创建了 RTCDa
  • 使用 Lodash 的 TypeScript:_.map(["123", " 234 "], _.trim) 返回 boolean[]?

    我有一个字符串数组 它们已像这样分割 var searchValue 600 800 123 180 var groups searchValue split gt 600 800 123 180 因此项目周围可能存在空格 并且我想删除空格
  • 在声明组件选择器时添加指令 - Angular 7

    我正在学习 Angular 并通过单击按钮动态创建组件 我正在尝试使用 Angular Material 的拖放功能来拖动这些创建的组件以对它们进行排序 我的基本组件 html 中有以下代码 div style margin 20px di
  • ThreeJS无法加载Json文件

    首先 我已经读过这个问题 https stackoverflow com questions 17201888 three js exporter export object not working with jsonloader r58没
  • 使用 jQuery Tablesorter 操作后如何恢复当前页面?

    我正在使用 tablesorter 但无法找到有关插件 tablesorter 寻呼机的任何文档 问题是我有一个显示一些数据的表 并且在每一行中都有一个删除链接 该链接附加了要删除的元素的唯一标识符 显然 是否可以保存我正在删除的页面 然后
  • 从 Firebase 实时数据库 + 存储加载图像

    我正在使用 Firebase 文档 react redux firebase 中的 create react app 创建类似汽车图片库的东西 图像信息存储在 Firebase 实时数据库中 但实际图像文件存储在 Firebase 存储中
  • 在 Google Apps 脚本中的文本前插入换行符

    我需要在 Google 文档中的某些文本之前插入一些换行符 尝试过这种方法但出现错误 var body DocumentApp getActiveDocument getBody var pattern WORD 1 var found b
  • 使用 Lodash 将对象键转换为具有键值数量的数组[重复]

    这个问题在这里已经有答案了 我有一个产品对象 products bread 1 milk 2 cheese 2 chicken 1 我想要一个包含产品名称的数组 如下所示 products bread milk milk cheese ch

随机推荐

  • 朱莉娅:变量未定义

    变量作用域的行为看起来很奇怪 代码块 tp 1 function test2 println tp end 工作得很好 同时 function test if tp 0 tp tp 1 end end 给出异常 tp 未定义 怎么了 由于变
  • 带有 ACR122U 的 libnfc 对 SELECT(通过 AID)APDU 没有响应

    See NFC 读取器 SELECT 通过 AID APDU 未路由到 Android 设备 https stackoverflow com q 50316799 2425802关于调试和最终结果 TL DR 读者可能已经不复存在了 我有
  • 如何使用第三方库来包含在 Firefox 插件/扩展中?

    我目前正在学习如何使用 XPCOM 创建 Firefox 插件 并且我想知道如何包含第三方库来开发它们 我遵循了一些教程从 C 文件编译 xpt 和 dll 在 https developer mozilla org en How to b
  • 删除并重新创建发布配置文件 VS 2017 后旧的 Azure 函数返回

    我注意到 如果使用 Azure 门户删除 Azure 函数 例如 My Function App 并使用 Visual Studio 2017 在同一资源组中创建具有相同名称 My Function App 的新应用程序 则所有旧函数都会返
  • 每次在 Linux 机器上创建新套接字时如何运行代码?

    每次在 Linux 服务器上创建新的 TCP 套接字时 我都需要调用一个函数 架构代码是 do new socket block until new socket created do something new socket while
  • BigQuery - 检查表是否已存在

    我在 BigQuery 中有一个数据集 该数据集包含多个表 我使用 BigQuery API 以编程方式执行以下步骤 查询数据集中的表 由于我的响应太大 我启用了allowLargeResults参数并将我的响应转移到目标表 然后 我将数据
  • Windows批处理文件删除.svn文件和文件夹

    为了删除 myfolder 中的所有 svn 文件 文件夹 子文件夹 我在批处理文件中使用这个简单的行 FOR R myfolder X IN svn DO RD S Q X 这有效 但如果没有 svn 文件 文件夹 批处理文件会显示一条警
  • Angular JS 在 POST 请求中验证 CSRF 令牌

    我正在使用 AngularJS 和 Rails 我有以下批量更新用户的请求 http method POST url scope update url params selected ids userIds 由于 URL 长度的限制 这不能
  • TextView 样式 ArrayIndexOutOfBoundsException

    我的管理控制台中的 PlayStore 经常发生崩溃 我不明白为什么它会崩溃 我从未重现过此崩溃 它似乎仅来自三星 Galaxy 设备 但不太确定 从 SDK 版本 4 1 4 2 4 3 开始 这是完整的 StackTrace andro
  • 使用 f 字符串固定小数点后的数字

    有没有一种简单的方法可以使用Python f 字符串来固定小数点后的位数 特别是 f 字符串 而不是其他字符串格式选项 如 format 或 例如 假设我想显示小数点后 2 位数字 我怎么做 这么说吧 a 10 1234 在格式表达式中包含
  • 嵌套 ItemsControl 存在严重性能问题

    我使用嵌套的 ItemsControl 来显示分层数据 问题是 即使数据很少 速度也非常慢 它还会完全阻塞 UI 线程 直到加载数据 我在这里做错了什么 生成演示数据并将其绑定到 ItemsControl 的代码 private void
  • 在 CakePHP 3 中哪里放置自定义 PHP 类?

    我有一个新的 PHP 类 我想从控制器调用它 在 CakePHP 文件夹结构中 我应该将这个新类放在哪里 从控制器调用或使用它的过程是什么 预先感谢您的合作 从我的角度来看 您可以重用任何自己的类以及任何第三方类作为utility班级 如果
  • 如何处理一个读取三角形三边并在输入有效的情况下计算面积的家庭作业程序?

    这是我的任务 创建一个名为 MyTriangle 的类 其中包含以下两个方法 Return true if the sum of any two sides is greater than the third side public sta
  • VBA用公式填充多张纸上的单元格

    我正在尝试为工作簿的每张工作表中的每个单元格设置公式 我需要将 2 个公式分布在 2 个不同的单元格范围内 我在 Variant 中定义了 strFormula 1 和 2 对于公式1 我希望分配到A到AJ列下的单元格 对于公式 2 我希望
  • 改变时间轴刻度标签的字体大小

    我正在根据常规时间轴绘制时间序列数据 目前 我使用默认的 多刻度 刻度格式 因此我在 X 轴上看到日期与 AM PM 小时的组合 现在 如何以更大的字体显示日期 使它们从小时刻度中脱颖而出 所有刻度似乎都有相同的 刻度 CSS 类 所以我无
  • R部分字符串匹配和返回值(在R中)

    我有多个采购数据库 我需要在其中运行我构建的 关键字 列表来识别某些产品 如果有匹配 我想将产品标记到手术类别 这是一个例子 采购数据库 实际上我有超过2 000 000行要查看 d lt data frame prod desc c BA
  • XCode 全局断点不显示堆栈跟踪

    我从 libobjc A dylib 和 CoreFoundation 位置设置了全局断点 我运行我的 iPhone 应用程序 它遇到了异常 XCode 在断点处停止 但在日志中没有显示任何错误 待处理断点 1 objc exception
  • java aes javax.crypto.BadPaddingException:给定的最终块未正确填充

    public class AES public String getEncrypt String pass String password encrypt pass return password public String getDecr
  • WSO2 API Manager 网关集群。如何在 api-manager.xml 中设置网关端点

    我计划在我的公司使用 WSO2 API 管理器 因此尝试使其能够集群工作 它由 Keymanager Gateway manager worker Publisher 2 个 AWS 实例上的 Store 组成 Host1包含Keymana
  • 切换无状态反应组件数组的可见性

    我试图简单地映射从 api 返回的一些数据 并为每个返回的对象创建一个无状态组件 我希望能够单击任何组件来切换其其余数据的可见性 我尝试了多种方法来做到这一点 但一直碰壁 我还搜索了堆栈溢出 但似乎找不到答案 我已经通过使它们成为单独的类组