繁体   English   中英

构建本地化react / redux应用程序的存储

[英]Structuring the store of a localized react / redux app

我很难在本地化的博客应用程序中构建我的数据。

我的应用程序显示帖子,带有嵌入式图片(一对多),三种语言(英语,法语和俄语)。

访问者可以选择其区域设置。 编辑人员可以用三种语言编辑其帖子的本地化版本。

目前,我店的结构如下:

{ articles:
  {
    en: {
      1: { id: 1, title: "my first title", body: "my first body", picture_ids: [1, 2, 3]},
      2: { id: 2, title: "my second title", body: "my second body", picture_ids: [1, 4, 5]},
      3: { id: 3, title: "my third title", body: "my third body", picture_ids: [6, 7, 8]},
      ...
    },
    fr: {
      1: { id: 1, title: "mon premier titre", body: "mon premier corps de texte", picture_ids: [1, 2, 3]},
      2: { id: 2, title: "mon second titre", body: "mon second corps de texte", picture_ids: [1, 4, 5]},
      3: { id: 3, title: "mon troisième titre", body: "mon troisième corps de texte", picture_ids: [6, 7, 8]},
      ...
    }
  },
  pictures:
   {
      en: {
        1: { id: 1, title: "My great picture", url: "http://..."},
        2: { id: 2, title: "My other great picture", url: "http://..."},
        3: { id: 3, title: "My not so great picture", url: "http://..."},
        ...
      },
      fr: {
        1: { id: 1, title: "Ma superbe photo", url: "http://..."},
        2: { id: 2, title: "Mon autre superbe photo", url: "http://..."},
        3: { id: 3, title: "Ma photo pas vraiment superbe", url: "http://..."},
        ...
      }
   },
   editStateOfFieldsOfArticles:
   {
      en: {
        1: { title: true, body: false },
        2: { title: false, body: true },
        3: { title: false, body: false },
        ...
      },
      fr: {
        1: { title: false, body: false },
        2: { title: false, body: false },
        3: { title: true, body: true },
        ...
      }
   }
}

在这个阶段,我的减速器并不是太臃肿,但我觉得我应该进一步规范化,以便预测何时我会在与文章的关系中添加标签,作者和其他国际化项目。

所以我正在考虑(i)在商店中为语言创建一个额外的字典,(ii)“拼合”所有其他字典以摆脱“语言环境”的子代码键,(iii)在每个字典中添加一个language_id字段。存储在其他词典中的项目和(iv)将每个词典中的数字键修改为复合键。 这看起来像这样:

{languages:
  {
    1: {id: 1, locale: "en", long: "English"},
    2: {id: 2, locale: "fr", long: "Français"},
    3: {id: 3, locale: "ru", long: "русская"}
  }
  articles:
  {
    11: {id: 1, title: "my first title", body: "my first body", picture_ids: [1, 2, 3], language_id: 1},
    21: {id: 2, title: "my second title", body: "my second body", picture_ids: [1, 4, 5], language_id: 1},
    31: {id: 3, title: "my third title", body: "my third body", picture_ids: [6, 7, 8], language_id: 1},
    42: {id: 1, title: "mon premier titre", body: "mon premier corps de texte", picture_ids: [1, 2, 3], language_id: 2},
    52: {id: 2, title: "mon second titre", body: "mon second corps de texte", picture_ids: [1, 4, 5], language_id: 2},
    62: {id: 3, title: "mon troisième titre", body: "mon troisième corps de texte", picture_ids: [6, 7, 8], language_id: 2},
    ...
  },
  pictures:
  {
    11: {id: 1, title: "My great picture", url: "http://...", language_id: 1},
    21: {id: 2, title: "My other great picture", url: "http://...", language_id: 1},
    31: {id: 3, title: "My not so great picture", url: "http://...", language_id: 1},
    12: {id: 1, title: "Ma superbe photo", url: "http://...", language_id: 2},
    22: {id: 2, title: "Mon autre superbe photo", url: "http://...", language_id: 2},
    32: {id: 3, title: "Ma photo pas vraiment superbe", url: "http://...", language_id: 2},
    ...
  },
  editStateOfFieldsOfArticles:
  }
    11: {title: true, body: false, language_id: 1},
    21: {title: false, body: true, language_id: 1},
    31: {title: false, body: false, language_id: 1},
    12: {title: false, body: false, language_id: 2},
    22: {title: false, body: false, language_id: 2},
    32: {title: true, body: true, language_id: 2},
    ...
  }
}

“articles”,“pictures”和“editStatesOfFieldsOfArticles”字典的键的最后一位数字对应于locale / language_id,其他数字将对应于项目id。

我看到当我有一个适用于所有三种语言的商店修改时(例如,如果我删除了一篇文章,该文章应该全部删除),我就可以从这种更扁平的结构中获益,从而无需迭代语言。三种语言,我目前必须在本地化的子词典和所有辅助商店的子词典(例如“editStateOfFieldsOfArticles”(我有一些其他这样的辅助词典))中进行操作。

但是,我并不完全确定我是否真的会从进一步展平我的哈希值中获得任何其他好处(并且for ... in循环不会有问题,只需要管理三种语言 - 此外,在我的用例中,我需要删除一篇文章,这个删除需要反映在所有三种语言中,我仍然需要迭代这三种语言数组来删除平展文章字典中的三个相应记录。

此外,我关注性能问题:因为我将整个集合(文章或任何其他国际化项目)存储在相同的扁平树下,无论它们与哪种语言相关,我担心访问这些值可能会减慢比较到一个更结构化的树,我可以通过“子键控”本地化的分支来访问项目 - 事实上,后端数据库将本地化的文章存储在不同的本地化表中。

我非常感谢有经验为国际化内容或其他具有复杂交叉关系的商店构建Redux商店的人,他们可以提供一些反馈或建议或提示自己的经验: - 代码可读性,特别是在reducer和in记忆选择器, - 比较嵌套树与扁平树的性能, - 进一步标准化与保持“嵌套”的整体好处。

这个派对超级晚了,但万一你还好奇。

我认为你的第一次实施绝对是优越的。 for循环超过3个项目不是一个征税交易,你可以(并且应该)将其分解为辅助函数:

var forEachLanguage = function(state, dataType, callback){
    var languages_data = state[dataType];
    for(language_index in languages_data){
        var data = languages_data[language_index];
        callback(data);
    }
}

//Example for deleting item 2 from articles
forEachLanguage(state, 'articles', function(data){
    delete data[2];
});

此外,如果您担心重复查找变得不必要昂贵(尽管实际上,我不认为这是一个问题),您可以使用Reselect来缓存查找并创建包含区域设置的可重用查找函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM