reactjs 输入状态值作为路线参数

ryevplcw  于 2022-12-03  发布在  React
关注(0)|答案(1)|浏览(126)

我想把输入值作为路由参数发送到服务器。我应该写一个函数来编码值吗?我正在尝试在没有任何库的情况下完成这项工作。
巧合的是,我错误地输入了localhost 8000,然后浏览器将localhost 3000 url附加到8000,只有这样设置的Search Params才起作用,我确实得到了附加到路由参数的值,但是服务器的url显然不是正确的。下面是我的代码:

import axios from 'axios';
import React, { useState } from 'react';
import { useSearchParams } from 'react-router-dom';

const AddProductForm = ({ id }) => {
  let [searchParams, setSearchParams] = useSearchParams();
  const [input, setInput] = useState({
    title: '',
    price: '',
    rating: '',
    description: '',
  });

  const handleSubmit = (e) => {
    e.preventDefault();
    setSearchParams(input)
    axios
      .put(`http://localhost:8080/api/v1/products/${id}?` + searchParams)
      .then((res) => console.log(res))
      .catch((err) => console.log(err));
  };

  const onChange = (e) => {
  //function to handle change of each input
   }

  return (
    <div className='container' >
      <form className='form' onSubmit={handleSubmit}>
        <div className='form_inputs'>
          <h1>Edit Product</h1>
          <div className='flex-column'>
            <label>Add new title</label>
            <input
              type='text'
              value={input.title}
              onChange={onChange}
              name='title'
              placeholder='Title'
            />
          </div>
          <div className='flex-column'>
            <label>Add new price</label>
            <input
              type='number'
              value={input.price}
              onChange={onChange}
              name='price'
              placeholder='Price'
            />
          </div>
         //All other inputs
        <button className='btn-block' type='submit'>
          Create
        </button>
      </form>
    </div>
  );
};

export default AddProductForm;

提交时,我只得到空对象URLSearchParams{}

ncecgwcz

ncecgwcz1#

setSearchParams函数的工作原理与navigate函数类似,它实现了一个导航操作,但只更新当前URL的搜索字符串。代码实际上并没有更新searchParams变量。
您想要取得input状态并建立新的URLSearchParams对象。
示例:

const handleSubmit = (e) => {
  e.preventDefault();
  const searchParams = new URLSearchParams(input);
  axios
    .put(`http://localhost:8080/api/v1/products/${id}?${searchParams.toString()}`)
    .then(console.log)
    .catch(console.warn);
};

相关问题