无法正确地将此嵌套对象设置在不可变记录中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法正确地将此嵌套对象设置在不可变记录中相关的知识,希望对你有一定的参考价值。

我没有设置平面对象不可变记录的问题。但是现在我有一个问题,我想设置一个记录,我想可能是一个记录列表?我正在尝试将我的firebase数据库中的User ref变为不可变记录或记录。

所以我从firebase加载我的用户引用。它的结构看起来像。

enter image description here

我无法弄清楚如何嵌套列表。用户有一个UID列表。从那里它变得更加平坦。但这甚至可能有一份记录清单吗?我没有在网上看到任何例子,所以我只是在这一点上迷失了。任何帮助将非常感谢。

如果我做的事情就像仅仅是个人资料一样,那就像。

  export const Profile = Record({
    key: null,
    profileName: '',
    profilePic: '',
    teamName: '', 
  });

看起来越过UID列表是第一个挑战我很难过去。一旦超过该初始列表,它就会更加平坦。

也许我甚至不应该做这个一成不变的。我打算向其他人建议如何处理这些数据。我刚刚习惯在我的应用程序中使用不可变记录。希望坚持这种模式,这是我的最后一点。

答案

基本上还没有记录列表。从我能找到的你可以使用带有记录值的map并根据this答案扩展Record类以获得与你想要的相同(下面的代码基于这种方法)。

我也可以找到一篇有趣的文章,它有多种方法,对于功能方面的相同想法here

如果这不是您所期望的,请告诉我。

var users = {
   'efbluh': {
    'profile': {
      profileName: 'bill',
      profilePic: 'https://blue',
      teamName: 'locals', 
    },
    'team': {
        'Lpphasd' : {
            competitorKey: 'a'
        }
    }
   },
   'fixbluh': {
    'profile': {
      profileName: 'bill',
      profilePic: 'https://blue',
      teamName: 'locals', 
    },
    'team': {
        'Lpphasd' : {
            competitorKey: 'a'
        },
        'asdsadasda' : {
            competitorKey: 'b'
        }
    }
   }
  };

var ProfileRecord = Immutable.Record({
    profileName: '',
    profilePic: '',
    teamName: '', 
  });
var teamRecord = Immutable.Record({
       competitorKey: ''
 });

class User extends Immutable.Record({'profile': new ProfileRecord(), 'team':Immutable.Map()}) {
  constructor({profile, team} = {}) {
    super({team: Immutable.Map(team).map(x=>new teamRecord(x)), profile: new ProfileRecord(profile)})
  }
}

var userMap = Immutable.Map(users).map(x=>new User(x));

// Verify that it's really a record
console.log(userMap.get('efbluh').get('profile').profileName)
console.log(userMap.get('fixbluh').toJS())
console.log(userMap.get('fixbluh').get('team').toJS())
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.7.4/immutable.min.js"></script>
另一答案

Shyams的建议绝对有点,所以这是公认的答案。如果您有需要,大多数人应该能够采用它。但是,如果你像我一样,并且正在使用带有redux和选择器的firebase,那么Shyams的建议对我有用。我没有声称它是你见过的最纯粹的反应/减少/选择器的例子,但它对我有用。

无需再费周折。

最初我从redux动作和reducer中获取我的用户。

我的动作和动作创建者从firebase获取数据,并最初将它存储在我拥有的一些高级firebase db函数的Key Value Immutable Record中。

import * as types from './actionTypes';
import { Record } from 'immutable';
import { FirebaseList } from 'src/firebase';

export const League = new Record({
  key: null,
  value: null
})

export const leagueFireDB = new FirebaseList({
  onLoad: loadLeagueSuccess,
},League);

export function loadLeague() {
  console.log("LOADLEAGUE::");
  return dispatch => {
    leagueFireDB.path = `users/`;
    leagueFireDB.subscribeChild(dispatch);
  };
}


export function loadLeagueSuccess(league) {
  console.log("LEAGUElOADSuccess::", league);
  return {
    type: types.LOAD_LEAGUE_SUCCESS,
    payload: league
  };
}

以上是关于无法正确地将此嵌套对象设置在不可变记录中的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将多个片段添加到片段过渡?

如何使用 jq 将此嵌套对象转换为扁平对象?

片段 TextView 无法从 parcelable 对象更新

如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?

如何正确地将 setState 设置为对象数组? [复制]

问题008:java 中代码块的风格有几种?单行注释可否嵌套?多行注释可否嵌套?