(六)搭建graphql项目, 前端可随意指定接口返回的数据(最后一节)

121 阅读2分钟

「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战

前言

上节课,我们已完成实时显示新增数据的功能,这节课我们需完成【点击个人,实时显示详情信息】的功能

SINGLE_PERSON查询

queries.js增加SINGLE_PERSON,即单人查询功能,部分代码如下所示:

const SINGLE_PERSON = gql`
    query($id:ID!){
        person(id:$id) {
            id
            name
            sex
            age
            job {
                name
                department
                persons{
                    id
                    name
                    age
                    sex
                }
            }
        }
    }
`
export {
    ...,
    SINGLE_PERSON
}

ID!即我们之前在服务端定义的GraphQLID类型,感叹号表明该类型为必传字段

上面的代码通过Personid查询到该人的姓名、性别、年龄及工作等相关信息,注意,我们这里需要返回该人的id信息,供后面的PersonDetail.js查询使用

PersonList.js

在该js文件内,完整代码如下所示:

import { useState } from 'react'
import { useQuery } from '@apollo/client'
import { PERSON_LIST } from '../queries/queries'
import PersonDetail from './PersonDetail'

const PersonList = props => {
    const [selectedId, setSelectedId] = useState('')

    function GetPersonList() {
        const { loading, error, data } = useQuery(PERSON_LIST)
        if (loading) return <p>Loading...</p>
        if (error) return <p>Error: {error}</p>
        return data.persons.map(({name, id}, index) => {
            return <li key={index} onClick={(e) => setSelectedId(id)}>{name}</li>
        })
    }

    return (
        <div>
            <h4>All Person Name</h4>
            <ul>
                {
                    GetPersonList()
                }
            </ul>
            <PersonDetail selectedId={selectedId}></PersonDetail>
        </div>
    );
}
export default PersonList;

data.persons里,每条数据都有id,这是因为在PERSON_LIST 查询接口内,我们新增了返回字段id,代码如下所示:

const PERSON_LIST = gql`
    {
        persons {
            name
            id
        }
    }
`

通过reactuseState,将数据变为响应式,点击li时,通过setSelectedId修改选中的id值,并将该id作为props数据传给PersonDetail 组件

PersonDetail.js

components文件夹下,增加PersonDetail.js组件,其代码如下所示:

import { useQuery } from '@apollo/client'
import { SINGLE_PERSON } from "../queries/queries"


const PersonDetail = props => {
    function GetSinglePerson() {
        const { loading, error, data } = useQuery(SINGLE_PERSON, {
            variables: {id: props.selectedId}
        })
        if (loading) return <p>Loading...</p>
        if (data && data.person) {
            const {name, sex, age, job} = data.person
            return (
                <div>
                    <h2>姓名:{name}</h2>
                    <p>性别: {sex}</p>
                    <p>年龄: {age}</p>
                    <p>职位: {job.name}</p>
                    <p>部门: {job.department}</p>
                    <h2>部门内所有人员信息:</h2>
                    <ul>
                        {
                            job.persons.map(a => {
                                return <li key={a.id}>姓名:{a.name}  性别:{a.sex}  年龄: {a.age}</li>
                            })
                        }
                    </ul>
                </div>
            )
        } else {
            return <div>无相关信息</div>
        }
    }
    return (
        <div id="person-detail">
            <p>人员详情:</p>
            {GetSinglePerson()}
        </div>
    )
}

export default PersonDetail;

使用useQueryPersonid作为参数传入,感兴趣的同学可以查看官方文档

页面效果

刷新页面后,点击lisi,下面出现该人的详情信息及部门所有人员信息 ,如下图所示 在这里插入图片描述

至此,所有graphql相关的基础知识已全部讲解完毕,后面大家可以基于功能代码添加样式功能,谢谢你们的观看,我们下期课程(Chrome插件开发)再见