首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >需要帮助简化Immutable.js对象数组更新

需要帮助简化Immutable.js对象数组更新
EN

Stack Overflow用户
提问于 2018-12-24 22:25:51
回答 2查看 209关注 0票数 1

我是第一次接触immutablejs,并且已经设法更新了存储在对象数组中的对象的属性。我的目标是简化我的开发,但我觉得我让它变得更复杂了。显然,我遗漏了一些让事情变得更简单的东西。

我创建了堆叠闪电战项目,其中一个项目的代码没有immutablejs https://stackblitz.com/edit/react-before-immutable,另一个项目的代码没有immutablejs https://stackblitz.com/edit/react-after-immutable

(下面的代码也是)。

我在这里看到过一些使用findIndex的第二个参数的示例,但从未为我调用过该函数。它也不在文档中,所以我猜它不再被支持了。

使用Immutable.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { useState } from 'react';
import { List } from 'immutable';

export default () => {

  const init = [{
    id: 101,
    interestLevel: 1
  },
  {
    id: 102,
    interestLevel: 0
  }];

  const [myArray, setMyArray] = useState(init);

  const updateRow = (e) => {
    const id = parseInt(e.target.attributes['data-id'].value);

    const immutableMyArray = List(myArray);
    const index = List(myArray).findIndex((item) => {
      return item.id === id;
    });
    const myRow = immutableMyArray.get(index);
    myRow.interestLevel++;
    const newArray = immutableMyArray.set(index, myRow);

    setMyArray(newArray);


  };


  return (

    <ul>
      {
        myArray.map(function (val) {
          return (
            <li key={val.id}>
              <button onClick={updateRow} data-id={val.id}  >Update Title</button>
              {val.id} :  {val.interestLevel}
            </li>
          )
        })
      }
    </ul>

  )
}

不使用Immutable.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { useState } from 'react';

export default () => {

  const init = [{
    id: 101,
    interestLevel: 1
  },
  {
    id: 102, 
    interestLevel: 0
  }];

  const [myArray, setMyArray] = useState(init);

  const updateRow = (e) => {
    const id = e.target.attributes['data-id'].value;
    const newMyArray = [...myArray];
    var index = newMyArray.findIndex(a=>a.id==id);
    newMyArray[index].interestLevel = myArray[index].interestLevel + 1;
    setMyArray(newMyArray);
  }


  return (

    <ul>
      {
        myArray.map(function (val) {
          return (
            <li key={val.id}>
              <button onClick={updateRow} data-id={val.id}  >Update Title</button>
              {val.id} :  {val.interestLevel}
            </li>
          )
        })
      }
    </ul>

  )
}
EN

回答 2

Stack Overflow用户

发布于 2018-12-24 23:18:00

你有没有考虑过不变的目的?

在您的示例中,您只是向代码添加了不必要的复杂性,而没有利用库提供的收益。

immutable的目的是提供受scala启发的不可变集合。换句话说,您创建了自己的集合,然后将其传递给另一个组件,您可以确定没有附加或删除任何元素。然而,个别元素不在这样的保证之下,部分原因是JS带来的约束(或缺乏约束)。

在您的代码中,几乎没有理由这样做。我冒然更改了您的报价,以展示如何做到这一点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Comp extends React.Component {

  constructor(props) {
    super(constructor);
    if (props.interests) {
      this.state = {
        interests: props.interests
      }
    } else {
      this.state = {
        interests: Immutable.Set([])
      }
    }
  }

  updateRow(e) {
    return function() {
      this.setState({
        interests: this.state.interests.update((elements) => {
          for (var element of elements) {
            if (element.id == e) {
              element.interestLevel++;
            }
          }
          return elements;
        })
      });
    }
  }


  render() {
    var interests = this.state.interests;
    var updateRow = this.updateRow;
    var list = this;
    //return (<div>Test</div>);
    return ( <
        ul > {
          interests.map(function(val) {
              return ( <
                  li key = {
                    val.id
                  } >
                  <
                  button onClick = {
                    updateRow(val.id).bind(list)
                  }
                  data-id = {
                    val.id
                  } > Update Title < /button> {
                  val.id
                }: {
                  val.interestLevel
                } <
                /li>
            )
          })
      } <
      /ul>

  )
}
}
var interests = Immutable.Set([{
    id: 1,
    interestLevel: 0
  },
  {
    id: 2,
    interestLevel: 0
  }
])
ReactDOM.render( < Comp interests = {
      interests
    }
    />, document.getElementById("app"));
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script src="https://cdn.jsdelivr.net/npm/immutable@4.0.0-rc.12/dist/immutable.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.7.0/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.7.0/umd/react-dom.production.min.js"></script>

<div id='app'></div>

更改:

  1. 将您的组件重写为类。这纯粹是为了突出显示您的组件现在采用包含兴趣的外部prop的其余更改。这意味着您可以传递一个Set,并确保它不会在组件
  2. 中突然添加元素,该组件负责兴趣级别。因此,无论何时单击其中一个按钮,都会在用于更新collection
  3. The中的项的Set上调用update函数。通过render()

将所有内容呈现为一个数组

这既更具可读性,也更易于管理。

票数 0
EN

Stack Overflow用户

发布于 2018-12-25 04:36:03

正如您在这篇comment中提到的,您正在寻找使用Immutable.js更新深层对象层次结构中的对象的更简单的方法。

updateIn应该可以做到这一点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const immutableObject = Immutable.fromJS({ outerProp: { innerCount: 1 } });
immutableObject.updateIn(['outerProp', 'innerCount'], count => count + 1);

还值得注意的是,您可能希望调用Immutable.fromJS()而不是使用Immutable.List(),因为后者不会将您的JavaScript对象深度转换为不可变对象,如果您假设数据结构是深度不可变的,这可能会导致错误。切换上面的代码以使用Immutable.fromJS()updateIn,我们得到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// In updateRow
const immutableMyArray = fromJS(myArray);
const index = immutableMyArray.findIndex((item) => {
  return item.id === id;
});
const newArray = immutableMyArray.updateIn([index, 'interestLevel'], interestLevel => interestLevel + 1);

setMyArray(newArray);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53918086

复制
相关文章
vue 数组对象更新
在使用数组的时候,数组内部数据发生改变,但是与数组绑定的页面的数据却没有发生变化。
py3study
2021/04/09
1.9K0
vue 数组对象更新
列表渲染之数组、对象更新检测
数组更新检测API (opens new window) 对象更新检测API (opens new window)
小小杰啊
2022/12/21
1.3K0
ScintillaNET 需要帮助
Scintilla是一个免费的源代码编辑控件,它完全开放源代码,并且提供一个license允许用户自由地将它用在开源软件或是商业软件中。作为源代码编辑控件,我们能在普通的的文本编辑控件中能看到的功能,Scintilla都完全能够实现,而且,它还能够提供很多编辑和调试源代码时有用的特殊功能。包括语法高亮显示,错误指示,代码自动完成以及代码提示等。而且在左边的空白处(margin),可以显示调试代码中非常有用的显示断点以及显示当前运行行等功能。而且,自定义风格的功能比其他大部分编辑器控件都开放,它允许用户自定
张善友
2018/01/22
1.5K0
数组(更新...)
在学习语言时,我们都会遇到数组.大学期间学过C,C++,Java,C#.这些语言中都学了数组,那时候用的不多,概念比较模糊,现在又学了php,里面也有数组,就打算写一篇笔记总结下不同语言的数组之间的异同. 首先看下C是怎么定义数组的:
仇诺伊
2018/09/12
9920
js 对象转数组对象_js 对象数组
var obj = {name:”张三”,name:”李四”,name:”王五”};
全栈程序员站长
2022/09/30
31.7K0
java对象数组 创建对象数组,初始化对象数组
对象数组的概念: 如果一个数组中的元素是对象类型,则称该数组为对象数组。 当需要一个类的多个对象时,应该用该类的对象数组来表示,通过改变下标值就可以访问到不同的对象。 对象数组的定义和使用: 对象数组的定义与一般数组的定义类似,但是需要为每一个元素实例化。 对象数组的声明形式是: 类名 对象数组名 [ ]; 为对象数组分配内存空间: 对象数组名=new 类名[数组长度];//注意 :此处不是构造方法了 可以将对象数组的声明和创建用一条语句来完成。例如:定义一个学生类对象数组,可以用下面的语句定义:Student stu[ ]=new Student[30]; stu [ ]是对象数组名,它所表示的数组一共有30个元素,每一个元素都是Student类的对象名,还没有实例化,所以还必须为每一个元素实例化。比如如下的过程: for(int i=0;i<stu.length;i++) stu[i]=new Student(); 实例化以后就可以使用每一个元素对象。 设计一个雇员类,并创建雇员类的对象数组,输出每个雇员的信息
用户7886150
2021/02/01
3.9K0
immutable.js 简介
Immutable数据就是一旦创建,就不能更改的数据。每当对Immutable对象进行修改的时候,就会返回一个新的Immutable对象,以此来保证数据的不可变
江米小枣
2020/06/16
1.6K0
immutable.js 简介
Immutable.js 简记
Immutable的中文翻译就是不可变,所以。对Immutable对象每一个操作都是返回的一个新的对象。寒假的时候再看看这个库的源码吧, 文档地址
ACK
2020/01/14
1.2K0
数组转对象,对象转数组对不对_对象数组初始化
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/30
2.3K0
java对象数组 创建对象数组,初始化对象数组「建议收藏」
对象数组的概念: 如果一个数组中的元素是对象类型,则称该数组为对象数组。 当需要一个类的多个对象时,应该用该类的对象数组来表示,通过改变下标值就可以访问到不同的对象。 对象数组的定义和使用: 对象数组的定义与一般数组的定义类似,但是需要为每一个元素实例化。 对象数组的声明形式是: 类名 对象数组名 [ ]; 为对象数组分配内存空间: 对象数组名=new 类名[数组长度];//注意 :此处不是构造方法了 可以将对象数组的声明和创建用一条语句来完成。例如:定义一个学生类对象数组,可以用下面的语句定义:Student stu[ ]=new Student[30]; stu [ ]是对象数组名,它所表示的数组一共有30个元素,每一个元素都是Student类的对象名,还没有实例化,所以还必须为每一个元素实例化。比如如下的过程: for(int i=0;i<stu.length;i++) stu[i]=new Student(); 实例化以后就可以使用每一个元素对象。 设计一个雇员类,并创建雇员类的对象数组,输出每个雇员的信息
全栈程序员站长
2022/08/31
2.3K0
数组/对象
数组 创建数组 var arr = new Array() var arr = [] 索引数组 arr[0] = '张三' arr[1] = 18 arr[2] = "男" console.log(arr) //["张三", 18, "男"] 关联数组 arr["name"] = '张三' arr["age"] = 18 arr["sex"] = "男" console.log(arr) //[name: "张三", age: 18, sex: "男"] 对象 创建对象 person = new
hss
2022/02/25
1.2K0
第二十二篇:思路拓展:如何打造高性能的 React 应用?
React 应用也是前端应用,如果之前你知道一些前端项目普适的性能优化手段,比如资源加载过程中的优化、减少重绘与回流、服务端渲染、启用 CDN 等,那么这些手段对于 React 来说也是同样奏效的。
越陌度阡
2023/08/09
4410
第二十二篇:思路拓展:如何打造高性能的 React 应用?
检测数组更新
因为Vue是响应式的,所以当数据发生变化时,Vue会自动检测数据变化,视图会发生对应的更新。
Qwe7
2022/05/27
4030
JavaScript 学习-16.简化对象写法
前言 ES6 允许在大括号{}里面,直接写入变量和函数,作为对象的属性和方法,书写更加简洁 变量  当做对象的属性 函数  当做对象的方法 对象简化写法 之前我们写一个对象是这样的 const person = { name: 'yoyo', age: 20, address: function () { return "上海市" } } 前面一篇讲到对象可以解构赋值,分别用变量接收对象的属性和方法 let {name, age, address} = pers
上海-悠悠
2022/05/23
4490
简化补充关联对象的业务代码
问题中有分类信息,但是默认保存在库表中的只有分类Id(categoryId),但是接口返回给调用方的时候,需要补充完整的Category信息
十毛
2019/11/26
4840
简化对象的创建 (IDE0140)
visual_basic_style_prefer_simplified_object_creation
用户4268038
2022/01/09
2700
java json数组转json对象_json对象数组
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/30
10K0
java json数组转json对象_json对象数组
js数组字符串转数组对象_js数组对象排序
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/01
15.4K0
JavaScript——数组对象
注意:当检测Array实例时, Array.isArray 优于 instanceof,因为Array.isArray能检测 iframes.
岳泽以
2022/10/26
1.5K0
深入探究Immutable.js的实现机制(一)
Immutable.js 由 Facebook 花费 3 年时间打造,为前端开发提供了很多便利。我们知道 Immutable.js 采用了持久化数据结构,保证每一个对象都是不可变的,任何添加、修改、删除等操作都会生成一个新的对象,且通过结构共享等方式大幅提高性能。
秋风的笔记
2020/10/27
1.5K0
深入探究Immutable.js的实现机制(一)

相似问题

需要帮助将对象数组简化为单个和

12

需要帮助简化查询

22

需要帮助简化代码

37

需要帮助简化jQuery代码

33

需要帮助简化javascript for loop

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文