Próbuję filtrować zestaw obiektów w stanie, gdy użytkownik kliknie przycisk na moim komponencie. Logika filtrowania działa dobrze, ale po powrocie do komponentu brakuje filtrowanych obiektów, a właściwość jest niezdefiniowana. Czy brakuje mi metody cyklu życia?Komponent reagujący nie jest ponownie renderowany po zmianie podpór
Zdarzenie click:
<div onClick={this.filterMyPosts}>My Posts</div>
...
<div>
{this.renderPosts()}
</div>
filterMyPosts
filterMyPosts() {
this.props.updateFilter("myPosts");
// filtering function uses switch statement based on strings to filter posts
}
Pojemnik komponent:
const mapStateToProps = (state) => {
return {currentUser: state.session.currentUser,
posts: allPostsByFilter(state.posts, state.filter, state.session.currentUser.id, state.bookmarks)}
};
const mapDispatchToProps = (dispatch) => ({
updateFilter: (filter) => dispatch(updateFilter(filter))
})
Filtrowanie odbywa się w innym pliku, który zwraca filtrowane wydarzenia w sposób obiekt. Ta logika nie ma błędów.
Problem: Zanim dojdzie do następujących funkcji: „posty” jest niezdefiniowany. Więc gdzieś po drodze, filtrowane posty nie wracają do komponentu.
renderPosts() {
return (
<div className ="user-profile-posts">
<ul>
{Object.keys(this.props.posts).map(id => <PostIndexItem
key={`posts-index-item${id}`}
post={this.props.posts[id]}
user={true}
/>)}
</ul>
</div>
);
}
EDIT - filtr funkcja
export const allPostsByFilter = (filter, currentUserId, posts) => {
switch (filter) {
case "myPosts":
let postKeys = Object.keys(posts).filter((id) => {
return(posts[id].user_id === currentUserId)
});
let userPosts = {}
postKeys.forEach((key) => userPosts[key] = posts[key])
let newPosts = {}
let postKeys = Object.keys(posts).filter((id) => {
return (Object.keys(userPosts).includes(id))
});
eventKeys.forEach((key) => newPosts[key] = posts[key])
return newPosts
default:
return posts
Przepraszam, że jest to literówka z wcześniej, zmieniłem ją powyżej. –
Czy możesz udostępnić funkcję allPostsByFilter? Może jest taki warunek, że nie wracasz. – vijayst
Dodałem powyższy kod. Chociaż nie sądzę, że to jest problem. Problem polega na tym, że funkcja updateFilter aktualizuje filtr w stanie, ale to nie powoduje ponownego uruchomienia "mapStateToProps", co oznacza, że filtrowane zdarzenia nigdy nie trafiają do użytkownika. Myślę, że musi istnieć jakaś metoda cyklu życia, z której mógłbym skorzystać. –