【问题标题】:REACT: How to update the list after click button EDIT?反应:单击按钮编辑后如何更新列表?
【发布时间】:2020-05-01 10:52:14
【问题描述】:

我使用fetch 向服务器发出请求并获得响应 - 类别列表。这个列表我显示在视图表中。在右侧的每个类别附近,我都有按钮 Edit。当我单击此按钮时,会出现 form,其中包含一个 input 和按钮 submit,我可以更改某个类别的标题。我使用 API 方法 PUT 更改类别。

但是当我在编辑类别标题后单击按钮submit 时,我的列表相同。因为列表没有更新。在那一刻,我仍然没有看到标题名称发生了变化。

我的列表只更新我在浏览器中重新加载页面

点击按钮EDIT后如何更新列表?

/..... - 我删除有问题的代码只是为了减少问题中的代码

Home.js:

const Home = () => {
  const [value, setValue] = useState({
    listCategory: [],
    numberId: "",              
    isOpened: false,
    /.....
  });
 
useEffect(() => {
    async function fetchData(/......) {
        const response = await fetch(`/.....`, {
          method: 'GET',  headers: {/.....}   });
        const data = await response.json();
             setValue(prev => ({
                ...prev,
                listCategory: data.data,
                /......
             }));
    }  fetchData(/.....); 
  }, [/.....]);

const changeId = (argNumberId) => {         
     setValue({
        ...value,
        numberId: argNumberId,
        isOpened: true
    });};
    
  return (
    <div>
               <Table dataAttribute={value.listCategory}  changeId={changeId}  valueId={value.numberId} />
    
                //COMPONENT WHICH CHANGE TITLE CATEGORY:
               {value.isOpened && <ChangeCategory value={value.numberId} />}    
   </div>);};

ChangeCategory.js:

const ChangeCategory = (props) => {
    const {handleSubmit, values, handleChange} = useFormik({  
      initialValues: {
          title: '',
      },
    onSubmit: async (formValues) => {
        const response = await fetch(`${apiUrl}/${props.value}`, { // props.value - id category which I edit, I get this id from field numberId in state
            method:'PUT',  body: JSON.stringify(formValues),  headers: {/.....} });
        const data = await response.json();  
       }});
    
   return (    
    <div>
      <form onSubmit={handleSubmit}>   
       <InputCategory
         label="title"
         id="title" 
         inputProps={{
           name:'title',
           value: values.title,
           onChange: handleChange,   
       }}/>
          <button type="submit">Edit</button>
     </form>
   </div>);};

Table.js:

export default (props) => (
  <table>
    <thead>
      <tr>
        <th>ID</th>  
        <th>TITLE</th>
      </tr>
    </thead>
    <tbody>
       {props.dataAttribute.map(item => (
        <tr key={item.id}>
          <td>{item.id} </td>
          <td>{item.title} </td>
          // BUTTON WHICH OPEN MODAL AND CHANGE ID IN STATE
          <td><button onClick={() => props.changeId(item.id)}>Edit</button></td> 
        </tr>
      ))}
    </tbody>
  </table>
);

【问题讨论】:

  • 数据提交成功后是否应该再次拨打fetchData()
  • @massam 你能在代码中展示如何做到这一点吗?并且在什么文件中执行它....因为我是初学者。
  • 我认为您应该根据您的 put 请求的响应更新您的值。
  • 我同意@acbay。无需再次获取数据。标题提交成功后,映射listCategory类别并将新标题设置为更改的标题。
  • @radovix 你能回答我的问题并写下你支持的代码吗?

标签: javascript reactjs


【解决方案1】:

在成功调用 API 后,您可以直接在 onSubmit 方法中更新状态。 您已经有了数据,所以只需添加处理更新的方法:

onSubmit: async (formValues) => {
              const response = await fetch(`${apiUrl}${listRoute}/${props.value}`, { // props.value - id category which I edit, I get this id from field numberId in state
                  method:'PUT',  body: JSON.stringify(formValues),  headers: {/.....} });
              const data = await response.json();  
                // ADD THIS :
               props.updateList(data.data);
       }}); 

您需要在父组件中添加updateListHome.js

const updateList = data => {

    setValue({ ...value, listCategory: data })
}

并将其作为道具传递给ChangeCategory

{value.isOpened && <ChangeCategory 
                       value={value.numberId} 
                       updateList={updateList}
                   />}

【讨论】:

  • 我按照你的建议做了,然后在我的编辑表单中单击按钮提交时出现错误:i.piccy.info/i9/6521c44da546e8cd6bed48de1c736b0c/1588333551/…
  • 查看我的新评论,因为我首先截错了屏幕截图
  • 我在回答中更新了传递给updateList 的参数,您必须检查您的 fetch 方法返回的内容,如果它类似于 GET 方法,那么 data.data 也会返回列表,它应该可以工作.
  • 我们无法为您完成这项工作,您应该尝试调试它,在您的 api 调用之后添加一些 console.log 或断点以查看您收到的内容,检查 listCategory 的值之前和之后 setValue inupdateList 你可能要适应它。
猜你喜欢
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
相关资源
最近更新 更多