【问题标题】:React js Laravel dynamic form fields validationReact js Laravel 动态表单字段验证
【发布时间】:2021-12-09 15:38:45
【问题描述】:

我有一个带有从 Laravel 8 验证的动态输入字段的表单,并将错误消息作为响应发回。

我在这里面临的问题是非动态表单字段已按预期进行验证,但在动态表单字段中,即使填充了动态输入字段并且错误消息显示在每个动态输入下,验证错误也会出现因此表单没有被提交。

这是我的 laravel 验证器。地址字段是唯一可以添加更多的动态输入字段。

$validator = Validator::make($request->all(), [
        'name' => 'required',
        'code' => 'required',
        'agent_id' => 'required',
        'phone_home' => 'required',
        'phone_work' => 'required',
        'phone_mobile' => 'required',
        'address' => 'required',
    ]);

    if ($validator->fails()) {
        return response()->json([
            'status' => 422,
            'errors' => $validator->messages(),
        ]);

我正在使用反应钩子。 这是我的状态的添加方式。

const [errorList, setError] = useState([])
const [inputList, setInputList] = useState({
name: '',
code: '',
agent_id: '',
phone_home: '',
phone_work: '',
phone_mobile: '',
address_list: [{ address: '' }],
})

在这里我提交表单并在未添加字段时出现错误。

const submitProductMix = (e) => {
e.preventDefault()
axios.post(`/api/create_customer`, inputList).then((res) => {
  if (res.data.status === 200) {
    swal('Success', res.data.message, 'success')
    setError([])
    history.push('/customers')
  } else if (res.data.status === 422) {
    setError(res.data.errors)
  }
})
}

这里是我添加动态表单字段和错误列表的地方。

{inputList.address_list.map((items, i) => {
              return (
                <>
                  <div key={i} className="row">
                    <div className="col-lg-8 mb-3">
                      <div className="form-group">
                        <label className="pb-2">
                          Delivery Address <span className="text-danger">*</span>
                        </label>
                        <input
                          className="form-control"
                          type="text"
                          name="address"
                          onChange={(e) => handleChange(e, i)}
                          value={items.address}
                          placeholder="Delivery Address"
                        />
                        <span className="text-danger">{errorList.address}</span>
                      </div>
                    </div>

                    {inputList.address_list.length - 1 === i && (
                      <div className="col-lg-1 mb-2 mt-4 pt-2">
                        <button className="btn btn-success" onClick={handleAddInput}>
                          Add
                        </button>
                      </div>
                    )}

                    {inputList.address_list.length !== 1 && (
                      <div className="col-lg-1 mb-2 mt-4 pt-2">
                        <button
                          className="btn btn-danger"
                          onClick={(e) => handleRemoveInput(e, i)}
                        >
                          Remove
                        </button>
                      </div>
                    )}
                  </div>
                </>
              )
            })}

我已经添加了整个地图以及两个按钮,以显示我如何专门添加或删除动态表单字段。

这是我的控制台日志

Object { name: (1) […], code: (1) […], agent_id: (1) […], phone_home: (1) […], phone_work: (1) […], phone_mobile: (1) […], address: (1) […] }
​
address: Array [ "The address field is required." ]
​​
0: "The address field is required."
​​
length: 1
​​
<prototype>: Array []
​
agent_id: Array [ "The agent id field is required." ]
​​
0: "The agent id field is required."
​​
length: 1
​​
<prototype>: Array []
​
code: Array [ "The code field is required." ]
​​
0: "The code field is required."
​​
length: 1
​​
<prototype>: Array []
​
name: Array [ "The name field is required." ]
​​
0: "The name field is required."
​​
length: 1
​​
<prototype>: Array []
​
phone_home: Array [ "The phone home field is required." ]
​​
0: "The phone home field is required."
​​
length: 1
​​
<prototype>: Array []
​
phone_mobile: Array [ "The phone mobile field is required." ]
​​
0: "The phone mobile field is required."
​​
length: 1
​​
<prototype>: Array []
​
phone_work: Array [ "The phone work field is required." ]
​​
0: "The phone work field is required."
​​
length: 1
​​
<prototype>: Array []
​
<prototype>: Object { … }

这是我从前端获得的后端请求数据(dd)。

 array:7 [
  "name" => null
  "code" => null
  "agent_id" => null
  "phone_home" => null
  "phone_work" => null
  "phone_mobile" => null
  "address_list" => array:1 [
    0 => array:1 [
      "address" => null
    ]
  ]
]

添加地址列表而不是验证器中的地址时的响应

{"status":422,"errors":{"name":["The name field is required."],"code":["The code field is required."],"agent_id":["The agent id field is required."],"phone_home":["The phone home field is required."],"phone_work":["The phone work field is required."],"phone_mobile":["The phone mobile field is required."]}}
 

【问题讨论】:

  • 你能用控制台记录res.data.errors的值是多少吗?
  • 我已经编辑了问题并添加了 res.data.errors 的控制台日志
  • 你能告诉我发送到后端的请求吗?我认为这可能是因为您从前端传递 address_list 并且在后端有 adress=>'required'
  • @Danish 我已将其添加到问题中。

标签: reactjs laravel


【解决方案1】:

您可以使用 'address_list' =&gt; 'required' 而不是

'address_list' =&gt; 'required'

所以你的最终验证器会是这样的

 $validator = Validator::make($request->all(), [
            'name' => 'required',
            'code' => 'required',
            'agent_id' => 'required',
            'phone_home' => 'required',
            'phone_work' => 'required',
            'phone_mobile' => 'required',
            'address_list' => 'required',
        ]);

或者,如果您想检查 array_list 是否包含至少一个地址,您可以这样做。

'address_list' => '必需|数组|min:1' 如果你想检查 address_list 必须在 1 到 10 之间,你也可以这样做

'address_list' => '必需|array|between:1,10'

为任何想要研究它的人附上link

【讨论】:

  • 现在我根本没有收到任何错误消息。尝试您的方法后。
  • @Mizy 因为现在如果你想检查地址列表是否包含至少一个地址没有错误,那么你也可以这样做 'address_list' => 'required|array|min:1' 见更新答案以更好地理解
  • 是的,我已经更新了答案并从前端检查了我的控制台日志,并且错误没有传递到前端。实际上,我对动态表单很陌生。
  • @Mizy 你看到我上面更新的答案了吗?如果不能,这将解决您的问题,您可以再次粘贴 console.log。如果没有错误,为什么要传递错误?如果这对您有帮助,也请将答案标记为已接受。
猜你喜欢
  • 2020-06-13
  • 2014-02-22
  • 1970-01-01
  • 2020-11-27
  • 2020-07-07
  • 2016-02-15
  • 2023-03-14
  • 2017-12-09
相关资源
最近更新 更多