You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Inertia与React无刷新页面的删除操作?

实现Inertia+React无刷新删除文章

问题描述

当前删除文章后需要刷新页面才能看到数据变化,希望修改代码实现无刷新实时更新。

解决方案

1. 修改后端ArticleController的destroy方法

原代码删除后会重定向到/admin页面,这会触发页面刷新。我们需要改为返回无内容响应,避免页面跳转:

public function destroy(Article $article) {
    $article->delete();
    // 返回204无内容响应,告知前端删除成功
    return response()->noContent();
}

2. 前端React组件修改

有两种常见方式实现无刷新更新,选其一即可:

方式一:通过本地状态更新(推荐,性能更好)

  • 父组件:持有文章列表的本地状态,传递删除成功的回调给子组件
import { useState } from 'react';
import { usePage } from '@inertiajs/react';
import ArticleItem from './ArticleItem';

function AdminArticles() {
  // 从Inertia页面props获取初始文章列表
  const { articles } = usePage().props;
  // 用本地状态管理文章列表
  const [localArticles, setLocalArticles] = useState(articles);

  // 删除成功后更新本地列表的回调
  const handleDeleteSuccess = (deletedArticleId) => {
    setLocalArticles(prev => prev.filter(article => article.id !== deletedArticleId));
  };

  return (
    <div className="articles-container">
      {localArticles.map(article => (
        <ArticleItem 
          key={article.id} 
          article={article} 
          onDeleteSuccess={handleDeleteSuccess} 
        />
      ))}
    </div>
  );
}

export default AdminArticles;
  • ArticleItem子组件:删除成功后调用父组件的回调,同时关闭操作弹窗
import { useState } from 'react';
import { usePage, Inertia } from '@inertiajs/react';

function ArticleItem({ article, onDeleteSuccess }) {
  const { url } = usePage();
  const inAdminPage = url.includes('/admin');
  const [options, setOptions] = useState(false);

  const handleOptionsClick = () => setOptions(!options);

  function onDeleteSubmitEventHandler(e) {
    e.preventDefault();
    Inertia.delete(`/article/${article.id}`)
      .then(() => {
        // 通知父组件移除已删除的文章
        onDeleteSuccess(article.id);
        // 关闭操作选项弹窗
        setOptions(false);
      })
      .catch(err => {
        console.error('删除失败:', err);
        // 这里可以添加错误提示,比如弹出toast
      });
  }

  return (
    <>
      {/* 文章内容展示部分 */}
      {inAdminPage && (
        <>
          <div onClick={handleOptionsClick} className="hover:bg-gray-100 hover:cursor-pointer transition rounded-full p-2 relative">
            <img src="/icon/options.svg" className="w-1" alt="操作选项" />
          </div>
          {options && (
            <div id="options" className="absolute right-7 bottom-0 shadow-md">
              <ul>
                <form onSubmit={onDeleteSubmitEventHandler}>
                  <button type="submit" className="hover:bg-gray-200 hover:cursor-pointer bg-white px-4 py-3">删除</button>
                </form>
                <li className="hover:bg-gray-200 bg-white px-4 py-3">编辑</li>
              </ul>
            </div>
          )}
        </>
      )}
    </>
  );
}

export default ArticleItem;

方式二:重新请求当前页面数据(适合简单场景)

如果不想维护本地状态,可以在删除成功后,让Inertia重新加载当前页面的props,而不刷新整个页面:

修改ArticleItem的删除事件处理函数:

function onDeleteSubmitEventHandler(e) {
  e.preventDefault();
  Inertia.delete(`/article/${article.id}`)
    .then(() => {
      // 重新加载当前页面的props,保留页面状态和滚动位置
      Inertia.visit(window.location.pathname, {
        preserveState: true,
        preserveScroll: true,
      });
      setOptions(false);
    });
}

这种方式会让Inertia重新请求/admin页面的数据,更新页面props中的文章列表,从而实现无刷新更新。


内容的提问来源于stack exchange,提问作者Althaf Budiman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 23:55:16