2. Adding Edit Page
Creating Edit Page​
First, we need to create our file, named edit.tsx
, under the src/pages/blog-posts
folder. We will then copy the edit page code generated by Inferencer and paste it into the file; for this, follow these steps:
Navigate to localhost:3000/blog-posts in your browser.
Click on any of the "Edit" buttons in the "Actions" column of the table to open the edit page.
Click on the "Show Code" button in the bottom right corner of the page.
You can see the edit page code generated by Inferencer. Copy it by clicking on the "Copy" button.
Paste the code into the newly created
edit.tsx
file.
You can see an example edit page generated by Inferencer below:
Understanding the Edit Component​
Hooks and Components in Edit Page​
The
useForm
hook is imported from@refinedev/react-hook-form
, which combines the features ofuseForm
hook from both React Hook Form and@refinedev/core
. When used the in the edit page, it fetches record data with the URL'sid
, populating and submitting the form withdataProvider
'supdate
method. It also offerssaveButtonProps
for the form's submit button.For more information, refer to the
useForm
documentation and the React Hook Form documentation→The
useNavigation
hook is used for navigating between pages. In this case, we are using it to navigate to thelist
pages when the user clicks on the "Blog Posts List" buttons.For more information, refer to the
useNavigation
documentation →
Handling Relationships​
On the edit page, we may need to select a record from another resource.
For example, if we need to select a category from the categories
resource to assign the blog post to the category, we can use the useSelect
hook provided by refine. This hook fetches the data by passing the params to the dataProvider
's getList
method and then returns the options
to be used in the <select/>
component.
For more information, refer to the
useSelect
documentation→
In the auto-generated edit page code, Inferencer used the useSelect
hook to select a category from the categories
resource like below:
const { options: categoryOptions } = useSelect({
resource: "categories",
});
The useSelect
hook returns 10 records by default, but the category of the blog post may not be in the first 10 records. To solve this problem, we can use the defaultValue
prop to set the default value of the useSelect
hook like below:
const { options: categoryOptions } = useSelect({
resource: "categories",
defaultValue: blogPostsData?.category?.id,
});
Adding the Edit Page to the App​
Now that we have created the edit page, we can add it to the App.tsx
file:
Open
src/App.tsx
file on your editor.Import the created
BlogPostEdit
component.Replace the
HeadlessInferencer
component with theBlogPostEdit
component.
import { Refine } from "@refinedev/core";
import { HeadlessInferencer } from "@refinedev/inferencer/headless";
import routerBindings, {
NavigateToResource,
UnsavedChangesNotifier,
} from "@refinedev/react-router-v6";
import dataProvider from "@refinedev/simple-rest";
import { BrowserRouter, Route, Routes, Outlet } from "react-router-dom";
import { BlogPostList } from "pages/blog-posts/list";
import { BlogPostEdit } from "pages/blog-posts/edit";
import { Layout } from "components/layout";
import "./App.css";
const App = () => {
return (
<BrowserRouter>
<Refine
routerProvider={routerBindings}
dataProvider={dataProvider("https://api.fake-rest.refine.dev")}
resources={[
{
name: "blog_posts",
list: "/blog-posts",
show: "/blog-posts/show/:id",
create: "/blog-posts/create",
edit: "/blog-posts/edit/:id",
},
]}
options={{
syncWithLocation: true,
warnWhenUnsavedChanges: true,
}}
>
<Routes>
<Route
element={
<Layout>
<Outlet />
</Layout>
}
>
<Route
index
element={
<NavigateToResource resource="blog_posts" />
}
/>
<Route path="blog-posts">
<Route index element={<BlogPostList />} />
<Route
path="show/:id"
element={<HeadlessInferencer />}
/>
<Route path="edit/:id" element={<BlogPostEdit />} />
<Route
path="create"
element={<HeadlessInferencer />}
/>
</Route>
<Route path="*" element={<div>Error!</div>} />
</Route>
</Routes>
<UnsavedChangesNotifier />
</Refine>
</BrowserRouter>
);
};
export default App;
Now, we can see the edit page in the browser at localhost:3000/blog-posts/edit/123