Reputation:
I am trying to delete a post with Redux however the state is not updating when I do so, only when I reload the page I can then delete the Posts which then display.
Please see the App.js
component here...
import React from 'react';
import { connect } from 'react-redux';
import PostForm from './PostForm';
import { getPosts, deletePost } from '../actions/actions';
class App extends React.Component {
componentDidMount () {
this.props.getPosts();
}
_getPostId(evt) {
const postId = evt.target.parentNode.parentNode.getAttribute('data-id');
this.props.deletePost(postId)
}
render() {
const posts = this.props.postsData.map( (index) => {
return (
<tr data-id={index._id}>
<td> {index.title} </td>
<td> {index.body} </td>
<td> <button className="btn btn-primary" onClick={this._getPostId.bind(this)}>Delete</button> </td>
</tr>
)
});
return (
<div>
<nav className="navbar navbar-default navbar-static-top">
<div className="container">
<a className="navbar-brand">Blog Admin</a>
</div>
</nav>
<div className="container">
<PostForm />
<table className="table">
<thead>
<tr>
<th>Title</th>
<th>Body</th>
</tr>
</thead>
<tbody>
{posts}
</tbody>
</table>
</div>
</div>
)
}
}
export default connect(state => state, { deletePost, getPosts })(App);
Please see my reducers.js
file below...
export const postsData = ( state = [], action ) => {
switch ( action.type ) {
case 'GET_POSTS':
return state;
case 'STORE_POSTS':
return [...action.data]
case 'ADD_POST':
let newPost = {
title: action.data.title,
body: action.data.body
}
return state.concat( [newPost] )
case 'DELETE_POST':
let postId = action.data;
return state.filter(p => p._id !== postId)
default:
return state;
}
}
Please the actions.js
file below...
import store from '../store/store.js';
export function getPosts() {
apiPostCall();
return { type: 'GET_POSTS' };
}
export function addNewPost(post) {
apiAddPost(post);
return { type: 'ADD_POST', data: post }
}
export function deletePost(postId) {
apiDeletePost(postId);
return { type: 'DELETE_POST', data: postId }
}
function apiPostCall() {
$.ajax({
method: "GET",
url: "/api/posts",
dataType: "json"
}).success(data => store.dispatch({ type: 'STORE_POSTS', data }))
}
function apiAddPost(post) {
$.ajax({
method: "POST",
url: "/api/posts",
data: post,
dataType: "json"
}).success()
}
function apiDeletePost(postId) {
$.ajax({
method: "DELETE",
url: "/api/posts/" + postId,
}).success();
}
Upvotes: 0
Views: 620
Reputation:
I have managed to solve this issue!
So after logging out some data I found out that when a post was added it did not include the id
from the database, only when I reloaded the page the posts included the id
because it calls the API.
So when a user adds a post via the form I then create an id
which is posted to the API and then sent to the Redux store.
Also thank you for your suggestions, much appreciated.
Upvotes: 1