Nuxt.jsxTyperscript에서 API 통신의 디자인 모드를 사용해 보았습니다
23686 단어 Nuxt.jsTypeScripttech
개시하다
이번에는 API 요청 처리에 대한 분할 관리 모드를 알았습니다. Nuxt.jsxTypeScript 항목에서 실제로 시도했습니다.더 좋은 글쓰기가 있다면 평론란에 알려주세요.
이 모드를 적용하는 목적은 다음과 같습니다.
컨디션
Repository
먼저 Repository를 살펴보겠습니다.
RESTful API의 CRUD에 따라 준비
index
,show
,create
,update
,delete
방법.api/repository.ts
import { NuxtAxiosInstance } from '@nuxtjs/axios';
import { AxiosResponse } from 'axios'
export interface CRUDActions {
index<T>(query?: string): Promise<AxiosResponse<T>>
show<T>(id: number): Promise<AxiosResponse<T>>
create<T>(payload: any): Promise<AxiosResponse<T>>
update<T>(payload: any, id?: number): Promise<AxiosResponse<T>>
delete(id?: number): Promise<AxiosResponse<any>>
}
export default (client: NuxtAxiosInstance) => (resource: string) => ({
index<T>(query?: string) {
return client.get<T>(`api/${resource}?${query}`)
},
show<T>(id: number) {
return client.get<T>(`api/${resource}/${id}`)
},
create<T>(payload: any) {
return client.post<T>(`api/${resource}`, payload)
},
update<T>(payload: any, id?: number) {
return client.patch<T>(resourcePath(resource, id), payload)
},
delete(id?: number) {
return client.delete(resourcePath(resource, id))
}
})
const resourcePath = (resource: string, id?: number) => {
let path
if (id) {
path = `api/${resource}/${id}`
} else {
path = `api/${resource}`
}
return path
}
RESTful API 중has원 관계라면 id가 포함되지 않고 단수 형식의 경로를 통해 얻을 수 있습니다.예: api/users/bank_account
그 상황을 감안하면resourcePath
방법은 id가 있는지 없는지에 대해 지점을 필요로 한다.(더 좋은 방법이 있나요?)RepositoryFactory
다음은 Repository-factory입니다.
plugins/repository-factory.ts
import createRepositories, { CRUDActions } from '@/api/repository'
export interface Repositories {
clients: CRUDActions
// リソースが増えるごとに追加する
}
export default (context: any, inject: any) => {
const repositoryWithAxios = createRepositories(context.$axios)
const repositories = {
clients: repositoryWithAxios('clients') // リソース名とマッピングする
}
inject('repositories', repositories)
}
마지막context.root
일 때 유형 정보를 참조할 수 있도록 다음과 같이 기술한다.nuxt.config.ts
import { Configuration } from '@nuxt/types'
import { NuxtAxiosInstance } from '@nuxtjs/axios'
import { Repositories } from '@/plugins/repository-factory'
const nuxtConfig: Configuration = {
// 省略
}
declare module 'vue/types/vue' {
interface Vue {
$axios: NuxtAxiosInstance
$repositories: Repositories // 追加
}
}
이렇게 준비하면 완성된다.사용 예
다음은 실제 사용의 예이다.
clients.vue
<template>...</template>
<script lang="ts">
import { defineComponent, provide } from '@vue/composition-api'
import clientStore from '@/store/client'
import ClientKey from '@/store/client-key'
export default defineComponent({
setup(_, context) {
const store = clientStore()
store.actions.getData(context.root.$repositories) // repositories を渡す
provide(ClientKey, store)
}
})
</script>
store/client.tsimport { Repositories } from '@/plugins/repository-factory'
import { ClientResponse } from '@/types/model/client'
..
const actions = {
async getData(repositories: Repositories) {
try {
const res = await repositories.clients.index<ClientResponse[]>() // repository を利用
...
} catch (error) {
// error handling
}
},
},
액세스 데이터의 처리를 순조롭게 숨겼다.타입의 보완도 효과가 있다.감상
처리된 자원이 증가
repository-factory.ts
하더라도 필요한 곳에 자원명을 추가하면 데이터 접근 처리도 재활용할 수 있어 편리하다.시험도 쉬워졌어요.참조 링크
Reference
이 문제에 관하여(Nuxt.jsxTyperscript에서 API 통신의 디자인 모드를 사용해 보았습니다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/hassan/articles/b7f76a56f59375텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)