Relay.js中的动态子/地图类型

时间:2015-09-25 12:49:23

标签: reactjs graphql relayjs

我有一个Item { title { de fr pa } } 类型。我希望将其标题翻译成可变数量的语言。我想象的是这样的结构:

GraphQLString

管理界面需要加载所有标题以进行编辑,并可选择添加新标题。换句话说,我正在寻找一个'dict'。

我现在能够解决这个问题的唯一方法是使用<div class="parent"> <span class="random"> <span class="child"> 并将语言字符串编码为JSON对象。

还有另一个,还是应该有?

2 个答案:

答案 0 :(得分:1)

您可以创建一个表示本地化字符串的类型:

const LocalizedStringType = new GraphQLObjectType({
  name: 'LocalizedString',
  description: 'A value object that represents a string and a language code',
  fields: () => ({
    languageCode: {type: GraphQLString},
    value: {type: GraphQLString},
  }),
});

然后公开这种类型的对象列表:

const ItemType = new GraphQLObjectType({
  name: 'Item',
  fields: () => ({
    localizedTitles: {type: GraphQLList(LocalizedStringType)}
  }),
});

在您的容器中,您可以按此操作此列表:

class Item extends React.Component {
  state = {language: 'en'};
  render() {
    const title = (
      this.props.item.localizedTitles.find(localizedString =>
        localizedString.languageCode === this.state.language
      ) ||
      `**Title missing for language with code ${this.state.language}**`
    );
    return <h1>{title}</h1>;
  }
}
Item = Relay.createContainer(Item, {
  fragments: {
    item: () => Relay.QL`
      fragment on Item {
        localizedTitles {
          languageCode
          value
        }
      }
    `,
  },
});

答案 1 :(得分:0)