💻 客户端中的突变
在 Explorer 中玩耍很有趣,但我们需要运行mutations来自我们应用程序中用户输入。因此,让我们转到客户端环境并使用新的挂钩发送我们的突变!
我们希望在我们从主页导航到跟踪页之前更新观看次数。此导航发生在我们的TrackCard组件内。
在 client/src/containers文件夹内,让我们打开 track-card.js文件。
首先,让我们开始从 @apollo/client 包中导入。我们需要 gql,因为我们将使用相同的字符串模板文字用于我们的 mutations,并且我们需要 useMutation 钩子将我们的 mutations 发送至服务器。
import { gql, useMutation } from "@apollo/client";
接下来,让我们创建新的 变量,该变量用于保存我们的 mutations,将其命名为 INCREMENT_TRACK_VIEWS,并将其设置为 gql 模板文字,并添加反引号 (`)。在反引号内,我们将粘贴 mutations,我们之前在 Studio 中已生成该 mutations,并添加一条注释来说明该 mutations 的作用。
/*** Mutation to increment a track's number of views*/const INCREMENT_TRACK_VIEWS = gql`mutation IncrementTrackViews($incrementTrackViewsId: ID!) {incrementTrackViews(id: $incrementTrackViewsId) {codesuccessmessagetrack {idnumberOfViews}}}`;
🎣 useMutation 钩子
由于这是一个 mutations,而不是一个 查询,因此我们不会使用 useQuery 我们熟悉的钩子。相反,我们将切换到 useMutation 钩子。
在 TrackCard 组件中,我们将首先调用该钩子。它采用我们之前设置的 mutations, INCREMENT_TRACK_VIEWS,作为第一个参数。
第二个参数是一个带有 variables 键的对象。此处,我们将添加 incrementTrackViewsId 变量并将其设定为我们准备导航到的轨道的 id。这个 id 已从 track 道具中为我们解构。
useMutation(INCREMENT_TRACK_VIEWS, {variables: { incrementTrackViewsId: id },});
现在,有趣的地方来了:与 useQuery 不同,调用 useMutation 实际上不会自动执行 Mutation!
相反, useMutation 钩子返回一个包含两个元素的数组,我们此处开始将其解构。
const [incrementTrackViews] = useMutation(INCREMENT_TRACK_VIEWS, {variables: { incrementTrackViewsId: id },});
第一个元素是 突变函数,稍后我们将使用该函数来实际运行 Mutation。我们将其称为 incrementTrackViews。第二个元素是一个关于 Mutation 的信息的对象: loading、 error 和 data。此组件不需要它,因此我们不必提取它。
👆🏽设置 onClick
我们何时想要运行我们的突变函数?当用户点击卡时!
我们向 CardContainer 组件添加一个 onClick 道具,并将其配置为调用我们的突变函数 incrementTrackViews。
<CardContainerto={`/track/${id}`}onClick={incrementTrackViews}>
loading、error 和 将项目从此方框拖拽到上面的空白处
数组
值
变量整数
参数
变异函数
GraphQL 操作
useGqlQuery选项useQueryuseMutation数据
useQuery 和 useMutation 钩子之间的区别?1️⃣ 还有最后一件事…
还有一件事,让我们添加一个控制台日志,以便在突变完成后检查它的响应。
为此,让我们回到设置 useMutation 钩子的地方,并在 options 对象中再添加一个属性。 onCompleted 属性是一个回调函数,当 突变 成功完成时它将运行,并且它可以访问返回的响应。我们将日志记录响应到浏览器控制台。
const [incrementTrackViews] = useMutation(INCREMENT_TRACK_VIEWS, {variables: { incrementTrackViewsId: id },// to observe what the mutation response returnsonCompleted: (data) => {console.log(data);},});
我们的客户端应用程序已准备好向服务器发送此 突变!让我们看看如何在上一课中完成我们的旅程!
使用 useMutation 挂钩将 ASSIGN_SPACESHIP_MUTATION 突变发送到服务器。它需要两个变量:spaceshipId 和 missionId。解构 mutate 函数(称之为 assignSpaceship),以及挂钩返回数组的 loading、error 和 data 属性。
分享您对此课程的问题和意见
您的反馈有助于我们改进!如果您遇到困难或困惑,请告知我们,我们会帮助您。所有评论都是公开的,并且必须遵守 Apollo 行为准则。请注意,已解决或处理的评论可能会被移除。
您需要一个 GitHub 账户才能发布以下内容。没有吗? 改为发布到我们的 Odyssey 论坛。