【问题标题】:Cant display value from array in graphql query using React无法使用 React 在 graphql 查询中显示数组中的值
【发布时间】:2020-03-26 19:17:28
【问题描述】:

我在前端使用带有 Apollo 的 React,但在显示标题和数组 like 的 ID 时遇到问题。我使用方法 .map 在轨道数组上进行迭代,我可以访问其中的所有值,但存储在数组中的值除外。这是解释它的代码比我猜的话更好:)

App.js

import React from "react";
import withStyles from "@material-ui/core/styles/withStyles";

import { Query } from 'react-apollo'
import { gql } from 'apollo-boost'

import SearchTracks from '../components/Track/SearchTracks'
import TrackList from '../components/Track/TrackList'
import CreateTrack from '../components/Track/CreateTrack'

import Loading from '../components/Shared/Loading'
import Error from '../components/Shared/Error'

const App = ({ classes }) => {
  return (
    <div className={classes.container}>
      <SearchTracks />
      <CreateTrack />
      <Query query={GET_TRACKS_QUERY}>
        {({ data, loading, error }) => {
          if (loading) return <Loading />
          if (error) return <Error error={error} />

          return <TrackList tracks={data.tracks} />
        }}
      </Query>
    </div>
  );
};

const GET_TRACKS_QUERY = gql`
  query getTracksQuery {
    tracks {
      id
      title
      description
      url
      likes {
        title
        id
      }
      postedBy {
        id
        username
      }
    }
  }
`

const styles = theme => ({
  container: {
    margin: "0 auto",
    maxWidth: 960,
    padding: theme.spacing.unit * 2
  }
});

export default withStyles(styles)(App);


TrackList.js

import React from "react";
import withStyles from "@material-ui/core/styles/withStyles";
import List from "@material-ui/core/List";
import ListItem from "@material-ui/core/ListItem";
import ListItemText from "@material-ui/core/ListItemText";
import Typography from "@material-ui/core/Typography";
import ExpansionPanel from "@material-ui/core/ExpansionPanel";
import ExpansionPanelDetails from "@material-ui/core/ExpansionPanelDetails";
import ExpansionPanelSummary from "@material-ui/core/ExpansionPanelSummary";
import ExpansionPanelActions from "@material-ui/core/ExpansionPanelActions";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";

import AudioPlayer from '../Shared/AudioPlayer'
import LikeTrack from './LikeTrack'
import CreateTrack from './CreateTrack'
import DeleteTrack from './DeleteTrack'
import UpdateTrack from './UpdateTrack'
import { Link } from 'react-router-dom'

const TrackList = ({ classes, tracks }) => (
  <List>
    {tracks.map( track => (
      <ExpansionPanel key={track.id}>
        <ExpansionPanelSummary expandIcon={<ExpandMoreIcon />}>
          <ListItem primaryTypographyProps={{
            variant: "subheading",
            color: "primary"
          }} className={classes.root}>
            <LikeTrack />
            <ListItemText primary={track.title} secondary={
              <Link className={classes.link} to={`/profile/${track.postedBy.id}`}>
                {track.postedBy.username}
              </Link>
            } />
            <AudioPlayer />
          </ListItem>
        </ExpansionPanelSummary>
        <ExpansionPanelDetails className={classes.details}>
            <Typography variant="body1">
              {track.description}
              {track.likes.id} {/* { Value not displayed } */}
            </Typography>
        </ExpansionPanelDetails>
        <ExpansionPanelActions>
          <UpdateTrack />
          <DeleteTrack />
        </ExpansionPanelActions>
      </ExpansionPanel>
    ) )}
  </List>
);

const styles = {
  root: {
    display: "flex",
    flexWrap: "wrap"
  },
  details: {
    alignItems: "center"
  },
  link: {
    color: "#424242",
    textDecoration: "none",
    "&:hover": {
      color: "black"
    }
  }
};

export default withStyles(styles)(TrackList);


【问题讨论】:

  • 更多上下文是 JSON 响应:{ "data": { "tracks": [ { "id": "1", "title": "Test Updated", "likes": [ { "title": null, "id": "1" } ], "postedBy": { "username": "filip" } }, { "id": "3", "title": "track 2", "likes": [ { "title": "Test", "id": "2" } ], "postedBy": { "username": "filip" } } ] } }
  • likes 是数组,不是对象?
  • @DanielRearden 是的,它是一个数组,对不起我的错误。
  • 使用另一个map() 或单个track.likes[0].id(用于第一个元素)

标签: reactjs graphql apollo


【解决方案1】:

感谢@xadm 使用另一个map() 或单个track.likes[0].id 有效!

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 2020-05-09
    • 2019-01-26
    • 2018-09-19
    • 2019-12-03
    • 2021-07-10
    • 2019-12-26
    • 2020-01-28
    • 2020-09-27
    相关资源
    最近更新 更多