InertiaJS 在验证错误后保留表单数据

Posted

技术标签:

【中文标题】InertiaJS 在验证错误后保留表单数据【英文标题】:InertiaJS keep form data after validation error 【发布时间】:2021-10-13 00:45:33 【问题描述】:

在我的 InertiaJS/VueJS 项目中,我有一个从后端接收一些数据的道具:

event: 
  type:    Object,
  default: () =>  return  
,

这就是事件 obj 在后端的样子:

['name' => 'Event Name']

我使用toRefs 来转换响应式道具并在 UI 中更新其属性:

const eventRef = toRefs(props).event

因此,当组件加载时,事件的名称为“事件名称”,当我将 UI 中的事件名称更新为“新名称”并提交表单时,我在请求中发送 eventRef obj 以创建新活动:

Inertia.post(url, eventRef, only: ['global'])

如果后端出现验证错误,我会将其返回到前端并在 UI 中显示错误(这可以正常工作)。我遇到的问题是 Inertia(或者可能是 VueJS)在创建组件时将对象 eventRef 返回到他以前的状态。这意味着 eventRefname 属性再次更改为“事件名称”,而不是保留在 UI 中更新的“新名称”。我想在提交表单后保留对象的状态。这是我的惯性响应:

component: "Events/EventNew"
props: 
  global:  // Global object

url: "/app/qa/events/new"
version: null

如您所见,我什至没有从后端获取“事件”道具,因此不应对其进行更新。在阅读了 Inertia 文档后,我认为请求选项中的简单 preserveState:true 可以完成这项工作,但这并没有发生。每次服务器返回 Inertia 响应时,eventRef obj 都会“重置”。

我在这里缺少什么?我会很感激一些帮助

【问题讨论】:

【参考方案1】:

我相信我在使用 Inertia 和 Vue2 时遇到了同样的问题。如果我理解正确,您可能会在尝试更新和输入的表单上看到这一点,对吧?您的验证正在运行,但表单不断将自身重置为之前的状态。如果是这样的话,为我解决这个问题的是:

不要直接使用Inertia.post(),而是使用Inertia Form Helper

Vue 2

<template>
  <form @submit.prevent="form.post('/login')">
    <!-- email -->
    <input type="text" v-model="form.email">
    <div v-if="form.errors.email"> form.errors.email </div>
    <!-- password -->
    <input type="password" v-model="form.password">
    <div v-if="form.errors.password"> form.errors.password </div>
    <!-- remember me -->
    <input type="checkbox" v-model="form.remember"> Remember Me
    <!-- submit -->
    <button type="submit" :disabled="form.processing">Login</button>
  </form>
</template>

<script>
export default 
  data() 
    return 
      form: this.$inertia.form(
        email: null,
        password: null,
        remember: false,
      ),
    
  ,

</script>

Vue 3

<template>
  <form @submit.prevent="form.post('/login')">
    <!-- email -->
    <input type="text" v-model="form.email">
    <div v-if="form.errors.email"> form.errors.email </div>
    <!-- password -->
    <input type="password" v-model="form.password">
    <div v-if="form.errors.password"> form.errors.password </div>
    <!-- remember me -->
    <input type="checkbox" v-model="form.remember"> Remember Me
    <!-- submit -->
    <button type="submit" :disabled="form.processing">Login</button>
  </form>
</template>

<script>
import  useForm  from '@inertiajs/inertia-vue3'

export default 
  setup () 
    const form = useForm(
      email: null,
      password: null,
      remember: false,
    )

    return  form 
  ,

</script>

【讨论】:

感谢您的回答。我发现了问题。在发送请求后,toRefs 正在更新 prop event。我将代码更新为一个简单的反应对象,问题就消失了。【参考方案2】:

我解决了问题,是toRefs在发送请求后修改了组件中的props。解决方案是使用reactive 对象:

const eventRef = reactive(props.event)

【讨论】:

以上是关于InertiaJS 在验证错误后保留表单数据的主要内容,如果未能解决你的问题,请参考以下文章

数据当用户在验证失败(Python,Django)时被重定向回表单时如何保留表单?

重定向后保留 Zend Form 对象

PHP 表单验证 - 完成表单实例

在 Rails 6 中使用 activestorage 时,如何在重新显示表单时保留文件?

在 laravel 的 ajax 中验证失败时保留旧的选择值

Rails 验证后如何清除表单