【前端】graphql 数据接入优化案例

简介: 【前端】graphql 数据接入优化案例

一、案例背景


七镜在基于react编写页面时,发现一段每个页面都重复的graphql相关代码,代码如下:

// 标记1
    const [dataNews, setDataNews] = useState<TGqlDimensionNews>({
        code: 0, content: [], count: 0, msg: {fail: "", success: ""}
    })
// 标记2
    const [condNews, setCondNews] = useState<TCondType>({
        page_after: 0,
        page_size: 10,
        order_by: "created_at",
        sort_by: "desc",
        detail: {},
        keyword: {
        },
        table_name: "dimension_news",
    })
// 标记3
    //useGraphql
    const [getDimensionNews, {data: dataDimensionNews, error}] = useLazyQuery(QUERY_DIMENSION_NEWS)
// 标记4
    // useEffect:
    useEffect(() => {
        getDimensionNews({
            variables: {
                from_id: auth.data.base.id,
                from_nickname: auth.data.account,
                content: JSON.stringify(condNews)
            }
        })
            .then(resp => {
                let tmpData = {...resp.data.dimensionNews} as TGqlDimensionNews
                // console.log("result:", tmpData.content[0].base_dimension.content)
                if (tmpData.code === 200) {
                    setDataNews(tmpData)
                }
            })
            .catch(e => {
                console.log(e)
            })
    }, [condNews])


  • 标记1:定义服务端数据接收过来的结构体
  • 标记2:定义服务端数据获取的过滤条件
  • 标记3:定义graphql数据获取的函数入口
  • 标记4:通过graphql数据获取函数接收服务端数据,并存入保存页面数据的地方(dataNews)

我们知道,写代码的时候,面对第一个新需求,快速实现一段代码;面对第二个差不多的需求,针对刚刚那段代码,复制粘贴并做一些小小的修改;面对第三个差不多的需求,应当重构前面的代码。



二、优化方案

首先,技术实现肯定是基于 react hooks。详细代码如下:

import React, {useState, useEffect, useContext} from "react";
import {DocumentNode, useLazyQuery} from "@apollo/react-hooks";
import {
    TCondType,
    TResponseCommon
} from "../../register-center/graphql/graphql-types/graphql-types";
import {ContextAuth} from "../../register-center/context/auth/context-auth";
export interface useGraphqlGetProps {
    cond: TCondType, // 接口参数
    gql_schema_query: DocumentNode, // Graphql schema
    gql_data_query_name: string, // 查询的表名
    setData: React.Dispatch<React.SetStateAction<TResponseCommon>> // 设置查询结果
}
function useGraphqlQuery(props: useGraphqlGetProps): [TCondType, React.Dispatch<React.SetStateAction<TCondType>>] {
    const [auth, setAuth] = useContext(ContextAuth) // 接口参数中的用户名和用户昵称的来源
    const [cond, setCond] = useState<TCondType>(props.cond)
    //useGraphql
    const [getData, {error}] = useLazyQuery(props.gql_schema_query)
    // useEffect
    useEffect(() => {
        if (!cond.table_name) {
            console.error("please replace cond.table_name")
            return
        }
        getData({
            variables: {
                from_id: auth.data.base.id,
                from_nickname: auth.data.account,
                content: JSON.stringify(cond)
            }
        })
            .then(resp => {
                let tmpData = {...resp.data[props.gql_data_query_name]}
                // console.log("result:", tmpData.content[0].base_dimension.content)
                if (tmpData.code === 200) {
                    props.setData(tmpData)
                }
            })
            .catch(e => {
                console.error(e)
            })
    }, [cond])
    return [cond, setCond]
}
export default useGraphqlQuery



实现思路:

  1. 该hook的初始化依赖于传入的【接口参数】、【graphql schema】、【查询的表名】、【设置查询结果的函数】
  2. 该hook中的实现逻辑与之前代码一致。
  3. 替换之前的代码中与传入参数一致的地方。




三、优化结果

优化后计入数据的代码:

    const [data, setData] = useState<TGqlDimensionApplicationCase>(initResponseCommon)
    const [cond, setCond] = useGraphqlQuery({
        cond: {
            ...initCond,
            table_name: "dimension_application_case",
        },
        gql_schema_query: QUERY_DIMENSION_APPLICATION_CASE,
        gql_data_query_name: "dimensionApplicationCase",
        setData: setData
    })

从优化前后的代码行数,可以看到代码量已经大大减少了,封装完毕。

目录
相关文章
|
2月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
上下文选择器(迭代选择器):基于祖先或同胞元素选择一个元素 ID和类选择器:基于id#和class的属性值进行选择元素。 属性选择器:基于属性的有无和特征进行选择。 ①上下文选择器: 上下文选择器的语法格式:标签1 标签2{属性:值;} //注意:组合选择器和上下文选择器的区别,组合选择器以逗号隔开, 上下文选择器以空格隔开 ②特殊的上下文选择器 子选择器> : 语法格式:标签1>标签2 解释说明:标签1和标签2
242 1
|
存储 前端开发 安全
前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
本文全面解析前端三种数据存储方式:Cookie、LocalStorage与SessionStorage。涵盖其定义、使用方法、生命周期、优缺点及典型应用场景,帮助开发者根据登录状态、用户偏好、会话控制等需求,选择合适的存储方案,提升Web应用的性能与安全性。(238字)
548 0
|
3月前
|
存储 前端开发 安全
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
207 5
|
6月前
|
前端开发 JavaScript 索引
前端性能优化:虚拟滚动技术原理与实战
前端性能优化:虚拟滚动技术原理与实战
821 80
|
6月前
|
缓存 监控 前端开发
前端性能优化:现代框架的关键策略
前端性能优化:现代框架的关键策略
336 74
|
6月前
|
缓存 前端开发 JavaScript
前端性能优化:打造流畅的用户体验
前端性能优化:打造流畅的用户体验
|
10月前
|
缓存 前端开发 UED
如何优化前端性能以提高加载速度
前端性能优化对提升网站加载速度至关重要,直接影响用户体验、SEO排名和转化率。本文介绍了优化前端加载速度的关键技巧,包括最小化HTTP请求、使用CDN、优化图片、利用浏览器缓存、压缩文件和实现懒加载。通过这些方法,可以显著减少页面加载时间,提高网站的整体性能和用户满意度。
|
存储 监控 安全
前端框架的数据驱动方式如何保证数据的安全性?
总之,前端框架的数据驱动方式需要综合运用多种手段来保证数据的安全性。从传输、存储、访问控制到防范攻击等各个方面进行全面考虑和实施,以确保用户数据的安全可靠。同时,不断加强安全管理和技术创新,以应对不断变化的安全挑战。
443 60
|
11月前
|
前端开发 JavaScript 开发者
前端 CSS 优化:提升页面美学与性能
前端CSS优化旨在提升页面美学与性能。通过简化选择器(如避免复杂后代选择器、减少通用选择器使用)、合并样式表、合理组织媒体查询,可减少浏览器计算成本和HTTP请求。利用硬件加速和优化动画帧率,确保动画流畅。定期清理冗余代码并使用缩写属性,进一步精简代码。这些策略不仅加快页面加载和渲染速度,还提升了视觉效果,为用户带来更优质的浏览体验。
|
缓存 前端开发 JavaScript
利用代码分割优化前端性能:策略与实践
在现代Web开发中,代码分割是提升页面加载性能的有效手段。本文介绍代码分割的概念、重要性及其实现策略,包括动态导入、路由分割等方法,并探讨在React、Vue、Angular等前端框架中的具体应用。