2016-08-25 2 views
5

많은 양의 데이터가있는 표를 표시해야합니다. 페이지 당 10 레코드를 표시하는 페이지 매기기 단추가 있습니다. 하나의 버튼이 "FETCH"라는 클릭으로 테이블이 채워집니다. 페이지로드시 테이블을 어떻게로드합니까?페이지를로드 할 때 react-redux에서 작업을 디스패치하는 방법은 무엇입니까?

이 action.js

import fetch from 'isomorphic-fetch'; 
export const ADD_BENEFICIARY = 'ADD_BENEFICIARY'; 
export const REMOVE_BENEFICIARY = 'REMOVE_BENEFICIARY'; 

export const ADD_PLAN_TO_COMPARE = 'ADD_PLAN_COMPARE'; 
export const REMOVE_PLAN_FROM_COMPARE = 'REMOVE_PLAN_COMPARE'; 
export const SHOW_PLAN_COMPARE = 'SHOW_PLAN_COMPARE'; 

export const NEXT_PAGE_PLAN_LIST = 'NEXT_PAGE_PLAN_LIST'; 
export const PREV_PAGE_PLAN_LIST = 'PREV_PAGE_PLAN_LIST'; 
export const REQUEST_PAGE_PLAN_LIST = 'REQUEST_PAGE_PLAN_LIST'; 
export const RECEIVE_PAGE_PLAN_LIST = 'RECEIVE_PAGE_PLAN_LIST'; 

export const showNextPageOfPlans =() => { 

    return { 
    type: NEXT_PAGE_PLAN_LIST 
    } 
} 

export const showPreviousPageOfPlans =() => { 

    return { 
    type: PREV_PAGE_PLAN_LIST 
    } 
} 

export const requestPageOfPlans = (startIdx, pageSize) => { 

    return { 
    type: REQUEST_PAGE_PLAN_LIST, 
    start: startIdx, 
    pageSize: pageSize 
    } 
} 

export const receivePageOfPlans = (startIdx, json) => { 

    return { 
    type: RECEIVE_PAGE_PLAN_LIST, 
    start: startIdx, 
    plans: json 
    } 
} 


export const fetchPlans = (startIdx, pageSize) => { 

    var str = sessionStorage.getItem('formValue'); //JSON.stringify(formValues); 

    return function (dispatch) { 
    dispatch(requestPageOfPlans(startIdx, pageSize)); 
    return fetch('http://172.16.32.57:9090/alternatePlans/plans/list/', {method: 'post', body: str, headers: new Headers({'Content-Type': 'application/json'}) }) 
     .then(response => response.json()) 
     .then(json => 
     dispatch(receivePageOfPlans(startIdx, json)) 
    ) 
    } 
} 

reducer.js

import { REQUEST_PAGE_PLAN_LIST, RECEIVE_PAGE_PLAN_LIST, 
     NEXT_PAGE_PLAN_LIST, PREV_PAGE_PLAN_LIST } from './actions'; 

const initialPaging = { 

    startIndex: 0, 
    lastIndex: 0, 
    pageSize: 10 
} 

const paging = (state = initialCurrentPage, action) => { 

    switch (action.type) { 

    case NEXT_PAGE_PLAN_LIST: 

     if (state.startIndex+state.pageSize <= state.lastIndex) { 

     return { ...state, startIndex: state.startIndex+state.pageSize }; 
     } 
     else { 

     return state; 
     } 

    case PREV_PAGE_PLAN_LIST: 

     if (state.startIndex-state.pageSize >= 0) { 

     return { ...state, startIndex: state.startIndex-state.pageSize }; 
     } 
     else { 

     return state; 
     } 

    case REQUEST_PAGE_PLAN_LIST: 

     return { ...state, isFetching: true }; 

    case RECEIVE_PAGE_PLAN_LIST: 

     return { ...state, isFetching: false }; 

    default: 
     return state; 
    } 

} 

var initialPlans = []; 

const plans = (state = initialPlans, action) => { 

    switch (action.type) { 

    case RECEIVE_PAGE_PLAN_LIST: 
     return action.plans.plans; 

    default: 
     return state; 
    } 
} 


const allReducers = (state = {}, action) => { 

    let items = plans(state.plans, action); 
    return { 
    plans: items, 
    paging: paging({ ...initialPaging, ...state.paging, lastIndex: items.length-1 }, action) 
    } 
} 

export default allReducers; 

P.S. 나는 반응이 빨라야한다. 공식 문서는 좋지만 설명은 매우 적습니다.

답변

4

페이지의 반응 구성 요소의 componentDidMount()에서 또는 그것을 이해하는 모든 곳에서이를 호출합니다. 그 구성 요소 파일에서 다음과 같습니다.

import { requestPageOfPlans } from 'actions'; 
import React from 'react'; 
import { connect } from 'react-redux'; 

class MyComponent extends React.Component { 
    componentDidMount() { 
    this.props.requestPageOfPlans(); 
    } 
} 

export default connect((state) => state, { requestPageOfPlans })(MyComponent); 

그래서 여기에서 핵심은 연결 설정입니다. 첫 번째 매개 변수는 국가 (감속기)를 소품 용 데이터로 변환하는 방법입니다. 필요에 따라 조정하십시오. 두 번째 것은 바인딩하려는 작업입니다. 또한 수동으로 디스패치를 ​​가져올 수도 있지만 필자는 개인적으로이 패턴을 좋아합니다. 구성 요소에 대한 조치를 소품으로 설정하고이를 호출 할 수 있습니다. 필요에 따라 인수를 전달하십시오. 이 페이지는 여기 : https://github.com/reactjs/react-redux/blob/master/docs/api.md#connectmapstatetoprops-mapdispatchtoprops-mergeprops-options 연결 기능을 자세히 설명합니다.

편집

프런트 엔드에 paginating하고 감안할 때, 당신은 구성 요소에 이르기까지 매김 데이터를 전달하기 위해, 다음 루프는 당신 무엇을 표시 통해 연결 mapStateToProps을 조정하는 기능을해야합니다 필요한 것. 개인적으로는 백 엔드에서 페이지 매김을 수행하고 각 페이지에 대해 새로운 요청을 수행합니다. 얼마나 많은 레코드가있을 것으로 예상하는지에 달려 있습니다. 당신이 렌더링 할 계획 방법에 다시 몇 가지 가정을 만들기

render() { 
    const plans = []; 
    const maxIndex = Math.min(this.props.startIndex + this.props.pageSize, this.props.lastIndex); 
    for (let i = this.props.startIndex || 0; i < maxIndex; i++) { 
    const plan = this.props.plans[i]; 
    plans.push(<Plan key={plan.id} plan={plan} />); 
    } 

    return (
    <ul>{plans}</ul> 
    ); 
} 

: 그 인덱스를 사용하여 구성 요소의 다음

export default connect((state) => { 
    return { 
    startIndex: state.paging.lastIndex, 
    pageSize: state.paging.pageSize, 
    lastIndex: state.paging.lastIndex, 
    plans: state.plans 
    }; 
}, { requestPageOfPlans })(MyComponent); 

, 루프 계획을 통해 :

는 그래서 연결이 같은 일을 할 계획 (Plan)이라는 구성 요소가 있다면 그 계획을 세우십시오.

+0

'reducers'에서 가져 오기 {requestPageOfPlans}; 이것의 insted 나는 이것을 행동했다. import {requestPageOfPlans} 'action'; 모든 결과를 가져 오는 중이고 해당 페이지 매김이 작동하지 않기 때문입니다. –

+0

아, 죄송합니다. 나는 파일 이름을 보려고 가까이서 보지 않았습니다. 나는 그곳에서 약간의 수입품을 깎아 내릴 것임을 알았다. 잠재적 인 데이터 작업 방법을 더 자세히 설명하기 위해 편집 내용을 작성했습니다. – agmcleod

0

componentDidMount는 주먹 페이지를로드하기에 좋은 타이밍입니다.

나는 페이지 변경이 작업이 아니라, 데이터로드를위한 일부 매개 변수라고 생각합니다.

ActionCreator

const userurl = '/rest/users' 

export const loadUsers = (page = 0) => { 
    return (dispatch) => { 
    axios.get(userurl+"?page="+page) 
    .then(function(resp) { 
     dispatch(loadUsersOK(resp.data._embedded.users, resp.data.page)); 
    }) 
    .catch(function(error) { 
    ... 
    }) 
    }; 
} 

구성 요소 JSX

<span style={{marginRight:15, fontSize: 14, color: '#333'}}>{page.number*page.size+1}-{page.number*page.size+page.size} of {' '} {page.totalElements}</span> 
<FlatButton style={flatButtonStyle} icon={<NavigationChevronLeft/>} onTouchTap={this.prevPage} /> 
<FlatButton style={flatButtonStyle} icon={<NavigationChevronRight/>} onTouchTap={this.nextPage} /> 

구성 요소 핸들러

prevPage() { 
    const { page } = this.props.users; 
    this.props.loadUsers(page.number - 1); 
    } 

    nextPage() { 
    const { page } = this.props.users; 
    this.props.loadUsers(page.number + 1); 
    } 

연결

const mapStateToProps = state => { 
    return { 
    users: state.users 
    } 
} 

const mapDispatchToProps = (dispatch, ownProps) => { 
    return { 
    loadUsers: (page=0) => dispatch(loadUsers(page)) 
    } 
} 

const Wrapped = connect(
    mapStateToProps, 
    mapDispatchToProps 
)(Users) 

ONLY ONE ACTION

export const loadUsersOK = (result, page) => ({ 
    type: LOAD_USERS_OK, 
    result, 
    page 
}) 

월이 도움이됩니다.

+0

로드시 디스패치하는 부분이 누락되었습니다. –

관련 문제