Как сопоставить вложенный массив в сопоставленном массиве в редукторе

TLDR: как мне лучше отобразить массив в реквизите initalState

Следующий код, который я пытаюсь попытаться, состоит в том, чтобы получить все postIds из подобного массива и сравнить post.id с like.postId

Однако

like.postId is undefined.

post.id доступен в журнале консоли, разница между сообщениями и лайками заключается в том, что сообщения отображаются на стороне клиента и лайков нет. Итак, я пытаюсь сделать сопоставление в редюсере, потому что мне нужно будет получить количество лайков хранится для каждого поста и сопоставить его с его уважаемым post.id.

Причина, по которой мне нужно было бы установить значения внутри лайков initialState, заключается в том, что мне нужно будет использовать это следующее действие, чтобы голосовать за сообщения.

  case ADD_LIKE:
        // console.info(action.id) // renders post id which is 2
        // console.info(state.posts) // logs posts array
        // console.info(state.posts)
            return {
            ...state,
            likes: state.likes + 1
        };

если я сделаю что-то подобное like[0].postId, он получит значения только для этого like.id. Мне нужно иметь возможность получить все лайки со всех постов, сравнить like.postId с post.id, а затем установить значение.

И получить счет как

{this.props.likes}

просто чтобы понять, как выглядит массив.

Это пример массива сообщений, и в массиве сообщений у вас есть массив лайков.

Как сопоставить вложенный массив в сопоставленном массиве в редукторе

Вот как я называю посты

export const GetPosts = () => {
    return (dispatch, getState) => {
        return Axios.get('/api/posts/myPosts')
            .then( (res) => {
                 const data = res.data
                 const likes = res.data // gets  the first item within array, and shows likes.
                 const myLikes = likes.map( (post) => {
                    return post.Likes
                 })
                 console.info(myLikes)

                 dispatch({type: GET_POSTS, data, myLikes})
             })

    }
}

редуктор

export default (state = initialState, action) => {
    switch (action.type) {
     case GET_POSTS:
            console.info(action.data[0].Likes.length)
            return {
                ...state, 
                posts: action.data, // maps posts fine
                // set likes to but it only gets the first post, when it should get all posts
                likes: action.data.map( (post) => {
                    action.myLikes.map( (like) => {
                        // if (post.id === like.postId){
                            console.info(like) // renders an array of likes for all posts
                            console.info(like.postId) // renders undefined, 
                        // }
                    })
                })
        }
}

вот как это отображается

PostList.js

render(){
        const {posts} = this.props;
        return (
            <div>
                {posts.map((post, i) => (
                    <Paper key = {post.id} style = {Styles.myPaper}>

                    {/* {...post} prevents us from writing all of the properties out */}
                        <PostItem                     
                             myTitle = {this.state.title} 
                             editChange = {this.onChange} 
                             editForm = {this.formEditing} 
                             isEditing = {this.props.isEditingId === post.id} 
                             removePost = {this.removePost} 
                             {...post} 
                        />
                    </Paper>
                ))}
            </div>
        )
    }

Действие GetPosts вызывается внутри этого компонента

class Posts extends Component {
  state = {
    posts: [],
    loading: true,
    isEditing: false, 
  }
  async componentWillMount(){
    await this.props.GetPosts();
    this.setState({ loading: false })
    const reduxPosts = this.props.myPosts;
    const ourPosts = reduxPosts  
    console.info(reduxPosts); // shows posts line 35
  }

  render() {
    const {loading} = this.state;
    const { myPosts} = this.props
    if (!this.props.isAuthenticated) {
      return (<Redirect to='/signIn' />);
    }
    if (loading){
      return "loading..."
    }
    return (
      <div className = "App" style = {Styles.wrapper}>
        <h1> Posts </h1>
        <PostList posts = {myPosts}/>
      </div>
    );
  }
}
const mapStateToProps = (state) => ({
  isAuthenticated: state.user.isAuthenticated,
  myPosts: state.post.posts
})
const mapDispatchToProps = (dispatch, state) => ({
  GetPosts: () => dispatch( GetPosts())
});
export default withRouter(connect(mapStateToProps,mapDispatchToProps)(Posts));
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
396
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы используете Массив.карта(), он будет создать новый массив с результатами вызова предоставленной функции для каждого элемента в вызывающем массиве, поэтому вы получите массив массивов (массив массива лайков каждого сообщения), чтобы решить вашу проблему и получить массив вам нужно использовать функцию редуктора следующим образом:

export const GetPosts = () => {
return (dispatch, getState) => {
    return Axios.get('/api/posts/myPosts')
        .then( (res) => {
             const data = res.data
             const likes = res.data // gets  the first item within array, and shows likes.
             const myLikes = likes.reduce( (acc,post) => {
                    return acc.concat(post.Likes)
                 },[])
             console.info(myLikes)

             dispatch({type: GET_POSTS, data, myLikes})
         })
}}

что с редуктором? я должен просто назвать это как likes: action.myLikes. большое спасибо за это, подчеркивая из-за этого. ваше объяснение имеет смысл, я собираюсь попробовать это.

Mr Patel 24.04.2019 22:09

как бы я мог хранить значения лайков. например, сообщение 1 имеет 39 лайков, а сообщение 2 - 100 лайков и т. д. Как я могу хранить количество лайков и сопоставлять их с соответствующим post.id. Я действительно ценю помощь.

Mr Patel 24.04.2019 22:28

это просто установка всех подобных значений на значение первого сообщения. когда он должен быть сопоставлен с определенным идентификатором сообщения

Mr Patel 24.04.2019 22:32

Другие вопросы по теме