如何在reactjs中管理树组件中的状态

2024-02-12

我已经为此苦苦挣扎了几天,试图找出“反应”的方式来做到这一点。

基本上,我有一棵树,一个可以任意嵌套的列表列表(列表......),我想要一个能够显示它并启用重新排列的组件。

这是我的数据:

var data = [{
      id: 1
    }, {
      id: 2, children: [
        {
          id: 3, children: [{id: 6}]
        }, {
          id: 4
        }, {
          id: 5
        }]
    }]

我的第一遍是只有一个“树”组件,在其渲染函数中构建 DOM 元素的嵌套列表(看这里的代码 https://github.com/notablemind/tree/blob/fa9cd0af481204aef36ab89d162cc03dd1dbc8b1/index.jsx#L96)。这实际上对于少量元素来说效果很好,但我希望能够支持数百个元素,并且当一个元素在树中移动时,重新渲染成本非常高(当有几百个元素时,重新渲染成本约为 600 毫秒)元素)。

所以我想我会让树的每个“节点”都是这个组件自己的实例。但这是我的问题(抱歉介绍太长):

每个节点是否应该从中央“数据库”动态查询其子节点 ID 列表并将其存储在状态中?或者最顶层的节点应该加载整个树并通过 props 向下传递所有内容?

我仍在尝试思考如何处理和分配状态和道具。

Thanks


我想用 React 尝试树结构,并想出了一个简单的组件,当您单击时会隐藏子树<h5>。一切都是一个TreeNode。这和你的想法相似吗?

您可以在此 JSFiddle 中看到它的实际效果:http://jsfiddle.net/ssorallen/XX8mw/ http://jsfiddle.net/ssorallen/XX8mw/

树节点.jsx:

var TreeNode = React.createClass({
  getInitialState: function() {
    return {
      visible: true
    };
  },
  render: function() {
    var childNodes;
    if (this.props.node.childNodes != null) {
      childNodes = this.props.node.childNodes.map(function(node, index) {
        return <li key={index}><TreeNode node={node} /></li>
      });
    }

    var style = {};
    if (!this.state.visible) {
      style.display = "none";
    }

    return (
      <div>
        <h5 onClick={this.toggle}>
          {this.props.node.title}
        </h5>
        <ul style={style}>
          {childNodes}
        </ul>
      </div>
    );
  },
  toggle: function() {
    this.setState({visible: !this.state.visible});
  }
});

bootstrap.jsx:

var tree = {
  title: "howdy",
  childNodes: [
    {title: "bobby"},
    {title: "suzie", childNodes: [
      {title: "puppy", childNodes: [
        {title: "dog house"}
      ]},
      {title: "cherry tree"}
    ]}
  ]
};

React.render(
  <TreeNode node={tree} />,
  document.getElementById("tree")
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在reactjs中管理树组件中的状态 的相关文章

随机推荐

  • YII 2.0 GridView 更新

    我在通过 javascript 更新 yiigridview 时遇到问题 我正在尝试以 yii 1 1 方式使用它 jQuery fn yiigridview update grid id 但这给我带来了错误 undefined is no
  • 管道阶段规范对象必须恰好包含一个带有 php mongo 聚合的字段

    我正在尝试将聚合与项目 匹配和排序一起使用 但出现异常 MongoResultException准确地说 说 exception A pipeline stage specification object must contain exac
  • php oop 从同一类的方法内部调用方法

    我有以下问题 class class name function b do something function c function a call function b 当我像往常一样调用函数时 this gt b 我收到此错误 Usin
  • 如何避免页面刷新时的按钮事件

    我有 aspx 页面 该页面通过单击按钮将数据插入数据库 但当我按下按钮时 它就正常了 我收到 成功插入数据 的成功消息 在这种情况下 如果我按 F5 或刷新页面 它将触发按钮单击事件 为什么应该是这样 如何避免这种情况 When the
  • 如何在Python中检查字符串是否只包含数字或“/”?

    我正在尝试检查字符串是否仅包含数字或 以用作验证形式 但是我找不到同时执行这两项操作的方法 自动取款机我有这个 if variable isdigit False 这适用于数字 但我还没有找到一种方法来检查斜杠 有很多选项 如此处所示 列表
  • 通过 unixODBC 和 FreeTDS 从 MSSQL 返回西里尔字母的问题

    我在远程主机上的 Ubuntu 12 04 LTS 和 MSSQL 2008 上使用 django pyodbc 作为数据库后端 除了返回西里尔字母符号外 它的效果很好 我看到的不是它们 而是问号 我已经开始调查可能导致此问题的原因 据我了
  • java打印阶乘计算过程

    您好 我需要打印阶乘计算过程 例如 如果用户输入的是5 系统应该打印出 5 4 3 2 1 120 我有这个代码 public static void factorial Scanner sc new Scanner System in i
  • 带有绿色复选标记的控制台消息 JavaScript

    我想知道控制台中是否有可能有一个绿色复选标记 就像 console warn 有黄色警告标志 console error 有红色错误标志一样 我在网上搜索过是否有类似的功能 但没有找到 现在我正在寻找一种方法将图标放在console log
  • 为什么在计时器回调中调用事件会导致以下代码被忽略?

    我正在编写一个简单的游戏 使用来自system threading命名空间来模拟操作的等待时间 我的目标是让计时器每秒执行一次 持续 x 秒 为了实现这一点 我在计时器回调中添加了一个计数器 问题是我在调用后放置的任何代码DeliveryP
  • 从 testNG 测试中检索 @Test 描述

    我的 testNG 测试有以下格式 Test alwaysRun true dependsOnMethods testStep 1 description Enter the names and verify that they are a
  • 如何在不循环的情况下一次为多个数组索引赋值?

    如何在 C 中为数组的多个元素设置一个值 Example 我有一个数组初始化如下 int array new int 2 3 5 3 7 2 9 我想将第二个和第五个索引之间的值设置为 8 怎样才能做到呢 好吧 如果你想变得可爱 你可以创建
  • Python 中内置最大堆 API

    默认 heapq 是最小队列实现 想知道是否有最大队列的选项 谢谢 我尝试使用 heapify max 作为最大堆的解决方案 但如何动态处理推送 弹出元素 看来 heapify max 只能在初始化时使用 import heapq def
  • C# 计算两个纬度/经度点之间沿大圆路径的 n 个点数

    我正在将具有纬度和经度值的机场之间的飞行路径绘制到 Google 地图 API v3 上 然而 与 v2 不同的是 v3 似乎没有选项可以在地图上两点之间放置折线并将其显示为大圆飞行路径 所以我的想法是 也许可以计算两个纬度 经度点之间的大
  • 如何将 Perl 嵌入到 C++ 应用程序中?

    我想从我的 C 程序中调用 Perl 脚本文件 我不确定我将分发给的人是否会安装 Perl 基本上 我正在寻找一个可以使用的 lib 文件 该文件具有类似 Apache 的分发许可证 您可以将 Perl 嵌入到您的应用程序中 Perl 嵌入
  • C++ 具有频繁变化概率的离散分布采样

    问题 我需要从由某些权重构成的离散分布中进行采样 例如 w1 w2 w3 因此概率分布为 p1 p2 p3 其中 pi wi w1 w2 有些wi变化非常频繁 但只占所有wi的比例非常低 但分布本身每次发生时都必须重新规范化 因此我相信 A
  • 如何像facebook的照片查看器一样修改历史记录?

    我的网站上有一个弹出模式 类似于 Facebook 的照片查看器 当模式打开时 它显示来自另一个页面的内容 我想更改地址栏值和历史记录以显示这一点 模式中有一个下拉菜单 可以将模式中的内容更改为不同页面的内容 当发生这种情况时 我再次想要更
  • MassTransit/RabbitMq 错误队列 - 如何删除消息?

    我有一个队列 QueueName 我定义了消费者和错误消息消费者如下 cfg ReceiveEndpoint queueName QueueName e gt e UseMessageRetry r gt r Immediate 2 e A
  • 如何选择 mysql 中最新的条目?

    我想从表中选择最新的条目 看看该条目是否与用户尝试输入的条目完全相同 如何执行查询 从最近的 发布 条目中选择 query Select FROM confused here SELECT FROM posting ORDER BY dat
  • 显示对话框片段时未调用 AndroiddispatchKeyEvent

    当我的对话框片段是hide dispatchKeyEvent工作得很好 Override public boolean dispatchKeyEvent KeyEvent event Toast makeText FragmentPlaye
  • 如何在reactjs中管理树组件中的状态

    我已经为此苦苦挣扎了几天 试图找出 反应 的方式来做到这一点 基本上 我有一棵树 一个可以任意嵌套的列表列表 列表 我想要一个能够显示它并启用重新排列的组件 这是我的数据 var data id 1 id 2 children id 3 c