React Redux Toolkit Tips: Difference between revisions
Jump to navigation
Jump to search
Line 69: | Line 69: | ||
setAddRequestStatus('idle') | setAddRequestStatus('idle') | ||
}_ | }_ | ||
</syntaxhighlight> | |||
=Tip 4 Layout= | |||
You can use this like angular for headers and footers | |||
<syntaxhighlight lang="js"> | |||
import { | |||
BrowserRouter, | |||
Routes, | |||
Route, | |||
Link, | |||
Outlet | |||
} from 'react-router-dom'; | |||
function App() { | |||
return ( | |||
<BrowserRouter> | |||
<Routes> | |||
<Route path="/" element={<Home />} /> | |||
<Route path="users" element={<Users />}> | |||
<Route path="/" element={<UsersIndex />} /> | |||
<Route path=":id" element={<UserProfile />} /> | |||
<Route path="me" element={<OwnUserProfile />} /> | |||
</Route> | |||
</Routes> | |||
</BrowserRouter> | |||
); | |||
} | |||
function Users() { | |||
return ( | |||
<div> | |||
<nav> | |||
<Link to="me">My Profile</Link> | |||
</nav> | |||
<Outlet /> | |||
</div> | |||
); | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> |
Revision as of 05:16, 31 December 2022
Introduction
Taken from YouTube https://www.youtube.com/watch?v=NqzdVN2tyvQ
Tip 1 Probably should know this
Instead of using
const posts = useSelector((state) => state.posts);
We can use
// In the component
const posts = useSelector(selectAllPosts)
// In the Slice
export const selectAllPosts = (state) => state.posts;
// We can make more with like
export const selectPostById= (state, postId) => state.posts =>
state.posts.find(post => post.id === postId);
Tip 2 Prepare Callback
We started with this where we pass an object in the action
const postsSlice = createSlice({
name: 'posts',
initialstate,
reducers: {
postAdded(state, action) {
state.push(action.payload)
}
}
})
They like to provide an API parameter to minimize the work and make a prepare function
const postsSlice = createSlice({
name: 'posts',
initialstate,
reducers: {
postAdded: {
reducer(state, action) {
state.push(action.payload)
},
prepare(title, content) {
return {
payload: {
id: nanoid(),
title,
content
}
}
}
}
}
})
Tip 3 Unwrap
Adding try catch to dispatch will unwrap the returning result which is a promise
try {
setAddRequestStatus('pending')
dispatch(addNewPost({title, body:content, userId }).unwrap()
setTitle('')
setContent('')
setUserId('')
} catch(err) {
console.error('Failed to save', err)
} finally {
setAddRequestStatus('idle')
}_
Tip 4 Layout
You can use this like angular for headers and footers
import {
BrowserRouter,
Routes,
Route,
Link,
Outlet
} from 'react-router-dom';
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="users" element={<Users />}>
<Route path="/" element={<UsersIndex />} />
<Route path=":id" element={<UserProfile />} />
<Route path="me" element={<OwnUserProfile />} />
</Route>
</Routes>
</BrowserRouter>
);
}
function Users() {
return (
<div>
<nav>
<Link to="me">My Profile</Link>
</nav>
<Outlet />
</div>
);
}