React,Apollo和express结合使用

在React中使用graphql和express

新建一个react项目,依次安装apollo/client,graphql,graphql-tag

npm i @apollo/client graphql graphql-tag

【注意】: 一定要注意apollo的版本和react的版本要对应,否则后面用起来会报错,会很难受。
下面依次来做一下增删改查四种操作

查询

查询使用的是useQuery()和useLazyQuery()

  • useQuery: useQuery接受一个graphql类型的代码片段,返回该接口执行的状态,数据以及其他信息等。在页面初始化时只调用一次
  • useLazyQuery: 用法和useLazyQuery相同,但是需要人为触发去调用
    以下是代码示例,带参的使用useLazyQuery,不带参的使用useQuery:

    不带参数的查询

//不带参数的

import { useQuery, gql } from '@apollo/client';
function App (){
    return <div>
        APP
        <DisplayLocations></DisplayLocations>
    </div>
}
const GET_LOCATIONS = gql`
  query {
    getList {
       na
       age,
       id
    }
  }
`;
function DisplayLocations() {
    const { loading, error, data } = useQuery(GET_LOCATIONS);

    if (loading) return <p>Loading...</p>; //加载中的组件
    if (error) return <p>Error : {error.message}</p>; // 报错的组件
    console.log({data})
    return <div> {
        data.getList.map(item => <div key={item.id}>
            <p>{item.id}</p>
            <span>{item.name}</span>---<span>{item.age}</span>
        </div>)
    } </div>
}
export default App

当初始化时,useQuery会执行一次,返回数据。

带参数的查询


import { useQuery,useLazyQuery, gql } from '@apollo/client';
import {useState} from "react";
function App (){
    return <div>
        APP
        <DisplayLocations></DisplayLocations>
    </div>
}
const Get_Data = gql`
  query getList($id: String) {
    getList (id: $id){
       name,
       age,
       id
    }
  }
`;
function DisplayLocations() {
    const[inputVal,setInputVal] = useState('64cbcc1e408fc1046b44bb6c')
    let [getList, {loading,data,error}] = useLazyQuery(Get_Data)

    if (loading) return <p>Loading...</p>; //加载中的组件
    if (error) return <p>Error : {error.message}</p>; // 报错的组件
    console.log({data})
    return <div>
        <input type="text" onChange={(event)=>{
            setInputVal(event.target.value)
            getList({ variables: { id: event.target.value} })
        }}></input>
        {
            data&&data.getList.map(item => <div key={item.id}>
            <p>{item.id}</p>
            <span>{item.name}</span>---<span>{item.age}</span>
        </div>
            )
    } </div>
}
export default App

以上组件会在input的change事件触发时执行查询,另: graphql的执行语句千万不要写错。

新增、修改、删除

此时我们用的hooks是useMutation,需要传参

//新增

import { useMutation,useLazyQuery, gql } from '@apollo/client';
import {useState} from "react";
function App (){
    return <div>
        APP
        <DisplayLocations></DisplayLocations>
    </div>
}
const Mutations_Data = gql`
  mutation createPerson($input: TempInput) {
      createPerson(input: $input){
         name,
         age,
         id
   }
  }
`;
function DisplayLocations() {
    let [createData, {data}] = useMutation(Mutations_Data)
    return <div>
        <button onClick={() => {
            createData({variables:{
                input:{
                    name: '李白',
                    age:12
                }
                }})
        }}>AddData</button>
       </div>
}
export default App

修改


import { useMutation,useLazyQuery, gql } from '@apollo/client';
import {useState} from "react";
function App (){
    return <div>
        APP
        <DisplayLocations></DisplayLocations>
    </div>
}
const Mutations_Data = gql`
  mutation updatePerson($id:String!,$input:TempInput) {
      updatePerson(id: $id, input: $input){
         name,
         age,
         id
   }
  }
`;
function DisplayLocations() {
    let [updateData, {data}] = useMutation(Mutations_Data)
    return <div>
        <button onClick={() => {
            updateData({variables:{
                    id:'64cbcc1e408fc1046b44bb6c',
                    input:{
                        name: '牡丹',
                        age:12
                    }
                }})
        }}>UpdateData</button>
    </div>
}
export default App

删除


import { useMutation,useLazyQuery, gql } from '@apollo/client';
import {useState} from "react";
function App (){
    return <div>
        APP
        <DisplayLocations></DisplayLocations>
    </div>
}
const Mutations_Data = gql`
  mutation deletePerson($id:String!) {
      deletePerson(id: $id)
  }
`;
function DisplayLocations() {
    let [deleteData, {data}] = useMutation(Mutations_Data)
    return <div>
        <button onClick={() => {
            deleteData({variables:{id:'64cbcc1e408fc1046b44bb6c'}})
        }}>DeleteData</button>
    </div>
}
export default App

需要注意的是: graphql语句千万不要写错,少一个!都会报错,一定要和后端写的一模一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ReactExpress 都是 Web 开发中常用的框架,它们可以通过 HTTP 协议进行通信,实现前后端交互。具体来说,React 通常作为前端框架,用于构建用户界面,而 Express 则通常作为后端框架,用于处理 HTTP 请求和响应。 React 应用可以通过 AJAX 或 Fetch API 发送 HTTP 请求到 Express 后端,请求可以携带参数、请求体等数据。Express 后端可以解析请求,进行相应的处理,并返回响应数据,例如 JSON 格式的数据或 HTML 页面。React 应用可以处理响应数据,更新界面或进行其他操作。 以下是一个简单的示例,演示 ReactExpress 如何交互: ```jsx // React 前端代码 import React, { useState } from 'react'; function App() { const [message, setMessage] = useState(''); const handleClick = async () => { const response = await fetch('/api/hello'); const data = await response.json(); setMessage(data.message); }; return ( <div> <button onClick={handleClick}>Click Me</button> <p>{message}</p> </div> ); } export default App; ``` ```js // Express 后端代码 const express = require('express'); const app = express(); app.get('/api/hello', (req, res) => { res.json({ message: 'Hello World!' }); }); app.listen(3000, () => { console.log('Server listening on port 3000'); }); ``` 在这个例子中,React 应用中的按钮被点击后,会发送一个 HTTP GET 请求到 Express 后端的 `/api/hello` 路径。Express 后端收到请求后,返回一个 JSON 格式的响应数据 `{ message: 'Hello World!' }`。React 应用收到响应数据后,将其中的 `message` 字段显示在页面上。 当然,这只是一个简单的示例,实际中的前后端交互可能更加复杂,例如需要进行身份验证、上传文件等等。但是基本的原理和方法都是类似的,即通过 HTTP 协议进行通信,前端发送请求,后端处理请求并返回响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值