【问题标题】:how to scroll to first validation error message in livewire laravel如何滚动到livewire laravel中的第一个验证错误消息
【发布时间】:2021-05-23 23:54:28
【问题描述】:

我是 livewire 的新手。我正在处理用户的注册过程。注册表非常大,验证对我来说也很好。问题是当用户提交表单验证时,用户看不到,因为提交按钮在底部,表单在顶部。

当我手动滚动到顶部时,正在显示错误消息。所以当用户提交表单时我想要什么,它会自动转到第一条错误消息。这是我的代码:

<form wire:submit.prevent="userRegister">
<div class="row">
    <div class="col-md-3">
        <label>First Name *</label>
    </div>
    <div class="col-md-9">
        <input type="text" wire:model="register.first_name" placeholder="Enter First Name" required>
        @error('register.first_name') <span class="text-danger">{{ $message }}</span> @enderror
    </div>
</div>
<div class="row">
    <div class="col-md-3">
        <label>Last Name *</label>
    </div>
    <div class="col-md-9">
        <input type="text" wire:model="register.last_name" placeholder="Enter Last Name">
        @error('register.last_name') <span class="text-danger">{{ $message }}</span> @enderror
    </div>
</div>
<div class="row">
    <div class="col-md-3">
        <label>Test 1 Name *</label>
    </div>
    <div class="col-md-9">
        <input type="text" wire:model="register.test1_name" placeholder="Enter Last Name">
    </div>
</div>
<div class="row">
    <div class="col-md-3">
        <label>Test 2 Name *</label>
    </div>
    <div class="col-md-9">
        <input type="text" wire:model="register.test2_name" placeholder="Enter Last Name">
    </div>
</div>
<div class="row">
    <div class="col-md-3">
        <label>Test 3 Name *</label>
    </div>
    <div class="col-md-9">
        <input type="text" wire:model="register.test3_name" placeholder="Enter Last Name">
    </div>
</div>
<div class="row">
    <div class="col-md-3"></div>
    <div class="col-md-9">
        <!--<input type="submit" value="Edit" class="edt-sb">-->
        <input wire:click="userRegister" type="submit" value="Submit" class="edt-sv">
    </div>
</div>
</form>

我的注册.php

<?php

namespace App\Http\Livewire;

use Livewire\Component;
class Register extends Component
{
public $register;
protected $rules = [
    'register.first_name' => 'bail|required|max:50',
    'register.last_name' => 'bail|required|max:50',
];

protected $messages = [
    'register.first_name.required' => 'Please enter first name',
];

public function userRegister(){
    $this->validate();
}

我希望当用户提交表单时,它会立即滚动到第一条错误消息。目前我的验证工作对我来说很完美。我需要使用高山js吗?为此。

【问题讨论】:

    标签: laravel laravel-7 laravel-livewire alpine.js


    【解决方案1】:

    Livewire 错误将保存在 $errors 包中,因此您可能可以为表单中的每个字段添加一个 id,并使用 alpinejs 将第一个元素与错误包中的 id 放在一起,例如:

            <div x-data="{
                    'errors': {{ json_encode(array_keys($errors->getMessages())) }},
                    focusField(input) {
                        fieldError = document.getElementById(input);
                        if (fieldError) {
                            fieldError.focus({preventScroll:false});
                        }
                    },
                }"
                 x-init="() => { $watch('errors', value => focusField(value[0])) }">
                
                        <input id="register.test3_name" type="text" wire:model="register.test3_name" placeholder="Enter Last Name">
            </div>
    

    【讨论】:

    • 请发布我如何应用 alpine js,因为我是 livewire 新手
    【解决方案2】:

    我几乎遇到了同样的问题,但成功消息不是错误消息,对于我使用 updated() 的错误消息,它们会在用户填写字段时实时显示。

    我的班级组件:

    class FormSubmissions extends Component
    {
        public $city;
        public $fullname;
    
        protected $rules = [
            'city' => 'required',
            'fullname' => 'required',
        ];
    
        public $successMessage;
    
        public function updated($propertyName)
        {
            $this->validateOnly($propertyName);
        }
    
        public function submitForm()
        {
            $submission = $this->validate();
    
    
    
            $this->successMessage = trans('site.success');
    
    
            $this->resetForm();
        }
    
    
        public function resetForm()
        {
            $this->city = '';
            $this->fullname = '';
        }
    
    }
    

    我的刀片模板:

    <div id="formSection" class="form-wrapper">
        @if ($successMessage)
            <div  class="alert alert-success alert-dismissible fade show" role="alert">
                {{ $successMessage }}
                <button  wire:click="$set('successMessage', null)" type="button" class="close" data-dismiss="alert" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <script>
                var elmnt = document.getElementById("formSection");
                elmnt.scrollIntoView();
            </script>
        @endif
        <form wire:submit.prevent="submitForm" action="/" method="POST">
        ...
    
    </div>
    

    所以添加成功消息的小脚本允许我滚动回我的表单顶部部分#formSection。

    【讨论】:

    • 如果我有很大的表格并分成 3 部分并且错误消息在表格中间怎么办?
    • 在这种情况下,选择器(例如字段的 ID)需要是动态的,因此您可以根据哪个字段有错误滚动到它。在我的代码中,FormSection 将从 Controller 定义,我确实在这里找到了一个在火线上打开的相关问题:github.com/livewire/livewire/issues/1415
    【解决方案3】:

    如果您使用&lt;x-jet-input-error/&gt; 组件来显示错误,您只需将resources/views/vendor/jetstream/components/input-error.blade.php(确保您已发布livewire 视图)文件修改为以下代码:

    @props(['for'])
    
    <span x-data="{hasError: '{{$errors->get($for)[0] ?? ''}}' }"
         x-init="()=> { $watch('hasError', (value)=> {
                let errorDiv = document.getElementsByClassName('invalid-feedback')[0];
                if(errorDiv){
                    errorDiv.scrollIntoView({behavior: 'smooth', block: 'center', inline: 'nearest'});
                }
        })}">
        @error($for)
            <span {{ $attributes->merge(['class' => 'invalid-feedback d-block']) }} role="alert" style="font-size: inherit">
                <strong>{{ $message }}</strong>
            </span>
        @enderror
    </span>
    

    说明:我们使用 alpine 来观察“$for”字段的验证消息的变化。一旦它发生变化(验证消息显示或消失),它就会查找错误块并滚动到它

    【讨论】:

      猜你喜欢
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 2020-01-25
      • 1970-01-01
      • 2023-04-09
      • 2020-08-15
      相关资源
      最近更新 更多