Реактивно-редукционное состояние с внешним json - PullRequest
0 голосов
/ 19 мая 2018

Я хочу перечислить посты в компоненте PostList.js из файла JSON. Я использую реагирование-редукса для управления состоянием и редукцию-сагу, чтобы получить файл json

Моими компонентами являются Post.js и PostList.js:

Post.js

    const Post = ({ post }) => {
    <li>
       {post}
    </li>
    }
    export default Post

PostList.js

class PostList extends React.Component {
componentDidMount() {
    console.log('did mount');
    this.props.fetchPosts();
}
render() {
    return (
        <div>
            <ul>
                {this.state.posts(post => (
                    <Post key={post.id} {...post}  />
                ))}
            </ul>
        </div>
    )
}
}

export default PostList

Редуктор

export default (state = [], action) => {
switch (action.type) {
    case "FETCH_POSTS":
        return {
            ...state,
            loading: true,
            posts: []
        }
    case "FETCH_FAILD": 
        return {
            ...state,
            loading: false,
            posts: []
        }
    case "FETCH_SUCCESS":
        return Object.assign({}, state, {
            posts: action.posts
        })
    default:
        return state;
}
}

Actions.js

export const fetchPosts = () => {
  return {
    type: 'FETCH_POSTS'
  }
}

export const fetchSuccess = data => ({
    type: "FETCH_SUCCESS",
    posts: data
})


export const fetchFaild = () => {
    return {
        type: 'FETCH_FAILD'
    }
}

GetPosts.js (контейнер)

import  { connect } from 'react-redux'
import { bindActionCreators } from 'redux'

import PostList from '../components/PostList'

import { fetchPosts } from '../actions'

const mapStateToProps = state => ({ posts: state.posts });

const mapDispatchToProps = dispatch => bindActionCreators({fetchPosts}, dispatch);

const GetPosts = connect(
    mapStateToProps,
    mapDispatchToProps 
)(PostList)

export default GetPosts

Saga.js

export function* fetchProducts() {
try {
    console.log('saga')
    const posts = yield call(api_fetchPost);
    yield put({ type: "FETCH_SUCCESS", posts});
} catch (e) {
    yield put({ type: "FETCH_FAILD", e});
    return;
}
}

export function* watchFetchProducts() {
    yield takeEvery("FETCH_POSTS", fetchProducts)
}

1 Ответ

0 голосов
/ 19 мая 2018

Вы извлекаете сообщения из состояния вашего компонента списка сообщений.Redux mapStateToProps отображает состояние редукса на реквизиты подключенного компонента, а не состояние

class PostList extends React.Component {
    componentDidMount() {
        console.log('did mount');
        this.props.fetchPosts();
    }
    render() {
        return (
            <div>
                <ul>
                    {this.props.posts && this.props.posts.map(post => {
                        return ( <Post key={post.id} {...post}  /> );
                    })}
                </ul>
            </div>
        )
    }
}

export default PostList

Измените this.state.posts на this.props.posts

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...