Reputation: 147
The blog posts would be created and there would be an option of removing the post. to do this i am using hook.
App.js:
import React, { useState } from 'react';
import Blog from './Blog';
import Createpost from './Createpost';
const App = () => {
const [posts, setPosts] = useState('');
const removePosts = (index) => {
setPosts(posts.filter((post) => post.index !== index));
};
return (
<div style={{ padding: 8 }} className="container">
<br />
<hr />
{<Createpost posts={posts} setPosts={setPosts} />}
<hr />
<Blog postData={posts} removePosts={removePosts} />
</div>
);
};
export default App;
Createpost.js:
import React, { useState } from 'react';
const Createpost = ({ user, posts, setPosts }) => {
const [title, setTitle] = useState('');
const [content, setContent] = useState('');
const handleTitle = (event) => {
setTitle(event.target.value);
};
const handleContent = (event) => {
setContent(event.target.value);
};
const handleCreate = (event) => {
const newPost = { title, content, author: user };
setPosts({ newPost, ...posts });
};
return (
<form
onSubmit={(e) => {
e.preventDefault();
handleCreate();
}}
>
<div>
author:<b>{user}</b>
</div>
<div>
<label htmlFor="create-title">Title:</label>
<input
tytpe="text"
value={title}
onChange={handleTitle}
name="create-
title"
id="create-title"
/>
</div>{' '}
<textarea value={content} onChange={handleContent} />
<input type="submit" value="Create" />
</form>
);
};
export default Createpost;
Blog.js:
import React, { useState } from 'react';
const BlogBody = (props) => {
const rows = props.postData.map((post, index) => {
const [title, author, content] = post;
return (
<React.Fragment key={index}>
<h2>{title}</h2>
<h5>
<i>{author}</i>
</h5>
<h3>{content}</h3>
<br />
<button onClick={() => props.removePosts(index)}>Delete</button>
<hr />
</React.Fragment>
);
});
return <div>{rows}</div>;
};
const Blog = () => {
const [postData, removePosts] = useState('');
return (
<div>
<BlogBody postData={postData} removePosts={removePosts} />
</div>
);
};
export default Blog;
there is no error showing after excuting npm start. but in browser, TypeError: props.postData.map is not a function is showing in Blog.js
can someone help me on this? i am jusr stuck here seems like forever.
i have started reactjs recently and started doing hooks yesterday. so please help.
Upvotes: 0
Views: 84
Reputation: 336
Map function can only be used for arrays.
Here, you are assigning initial state of postData as a string
i.e, const [postData, removePosts] = useState('');
Please change the initial state in useState to an array
i.e, const [postData, removePosts] = useState([]);
Upvotes: 1
Reputation: 2044
You are creating postData
as a string:
const [postData, removePosts] = useState('');
If you'd like it to be an array you should change the initial value.
const [posts, setPosts] = useState([]);
// Add posts:
setPosts((prevPosts) => [...prevPosts, 'new post'])
Upvotes: 3