使用 Django、GraphQL、Apollo 和 VueJS 进行 URL 管理

Posted

技术标签:

【中文标题】使用 Django、GraphQL、Apollo 和 VueJS 进行 URL 管理【英文标题】:URL management with Django, GraphQL, Apollo and VueJS 【发布时间】:2020-06-07 22:41:57 【问题描述】:

正如标题中所说,我在我的项目中使用DjangoGraphQLApolloVueJS。 我正在将其开发为SPA(单页应用程序)。

一切正常,直到我按下 F5 按钮并刷新页面。实际上,它显示了一个未知页面。问题是 VueRouter 正在管理 SPA,它运行良好。但是当我按下 F5 时,即 Django 会尝试为当前 URL 提供一个页面,但由于它不知道它,所以它无法提供相应的页面。

我的问题如下: 当我在特定的表单视图(即:用户表单视图)上时,我的 URL 如下:

http://localhost:8000/user

由于我将 GraphQL 用于我的 API,因此检索到的数据不是基于 URL。事实上,那是我的 VueJS 组件,上面写着:Hey Apollo, run that GraphQL to retrieve the User I want

所以当我刷新时,是的,它服务于用户表单视图..但为空。

问题是:我该如何解决这个问题?

为了清楚起见,这里有一些代码示例:

我的 Django 网址:

# (... other imports here ...)
from .schema import schema

urlpatterns = [
    path('admin/', admin.site.urls),
    path('graphql', csrf_exempt(GraphQLView.as_view(graphiql=True, schema=schema))),  # 'schema' is the main GraphQL schema
    path('', TemplateView.as_view(template_name='index.html')),
    re_path(r'^.*$', TemplateView.as_view(template_name='index.html'))  # I saw that many times to serve the page whatever the URL is when refreshing the page
]

我的 Vue 路由器:

export default new Router(
  mode: 'history',
  routes: [
     path: '/', name: 'MainApp' ,
    // ...
     path: '/users', name: 'UserList', component: UserList ,
     path: '/user/create', name: 'UserFormCreate', component: UserForm, props: true ,
     path: '/user', name: 'UserFormView', component: UserForm, props: true ,
     path: '/user/edit', name: 'UserFormEdit', component: UserForm, props: true ,
    // Same pattern for other models like 'Group' ...
  ]

我的示例 VueJS 组件:

<script>
import 
  // ...
  USER_QUERY,
  // ...
 from '../../graphql/base/user.js'

export default 
  name: 'UserForm',
  props: 
    userId: Number,
    editing: 
      type: Boolean,
      default: false
    
  ,
  apollo: 
    user: 
      query: USER_QUERY,
      variables ()  return  id: this.userId  ,
      skip ()  return this.userId === undefined ,
      result ( data ) 
        this.form.username = data.user.username
        this.form.firstName = data.user.firstName
        this.form.lastName = data.user.lastName
      
    
  ,
  data () 
    return 
      form: 
        username: '',
        password: '',
        firstName: '',
        lastName: ''
      ,
      // ...
    
  ,
  methods: 
    // ...
  

我不得不提一下,我或多或少地看到了相关的主题,但这并不能解决我的问题。

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

编辑您的路由路径以使用参数。例如:

 path: '/user/:userId', name: 'UserFormView', component: UserForm, props: true 

现在,应用程序会将user/ 路径后面的任何数字解释为名为@9​​87654324@ 的道具。 (props: true 在这里使用参数作为道具很重要。)

您需要做的唯一其他更改是调整您的路由器链接以包含id(例如:http://localhost:8000/user/1),以便在刷新页面时,将有一个参数可供读取。

【讨论】:

因为我已经使用openUserFormView (user, index) this.$router.push( name: 'UserFormView', params: userId: user.id ) , 从他们的列表中打开了用户表单视图,我想它会立即起作用!为什么我没有早点考虑...?! 似乎您已经完成了大部分所需的设计操作,甚至 props: true :) 是的,似乎.. 但是由于我使用的是 GraphQL,所以我根本没有考虑使用 URL 中的参数来做这件事……我会试试这个,如果有问题再回来!谢谢 嗯,它工作得很好。一切都准备好了..我唯一需要添加的是 URL 中的:userId,因为其他一切都已经完成。感谢您的快速帮助,我现在没有考虑在 URL 中使用参数..!

以上是关于使用 Django、GraphQL、Apollo 和 VueJS 进行 URL 管理的主要内容,如果未能解决你的问题,请参考以下文章

在使用 django 和 react 时,用 apollo 和 graphql 替换 redux 是个好主意吗?

使用 nuxt-apollo 时如何使用 GraphQL 查询?

如何将 Angular/Apollo 客户端与 graphene-django 集成?

Apollo 与 Angular 快速入门:未知错误

this.$apollo 始终未定义

使用 Express-GraphQL 和 React-Apollo 订阅 GraphQL