在React / Redux应用程序中将值从Store传递到AJAX查询字符串

时间:2017-08-22 21:56:31

标签: reactjs redux react-redux redux-saga superagent

如果我在下面提出请求,一切正常:

var ofst = 0;

function* GettingJson(offset=ofst){
var url = `/api/publishbooks/skip=${offset}&limit=12&sort=publishDate&sortDir=desc&_=1501513343421`;
const res = yield request.get(url);
}

但是,当然,我希望 ofst 从商店中获取它的值,并且我有一个带有 mapStateToProps 函数的容器组件,它返回参数 - offset: state.OffsetReducer

class BookListContainer extends Component{

componentWillMount(){
    this.props.ajaxRequestTriggeredMethod();
}

render() {
    return (
        <div>
            <BooksList DataInputParam={this.props.books} BtnClickHandler={this.props.buttonClickedMethod} />            
        </div>
    );
}
}


const mapStateToProps = (state) => {
    return{
        books: state.BooksReducer,
        offset: state.OffsetReducer
    };
};

const mapDispatchToProps = (dispatch) => {
    return {
        buttonClickedMethod: () => dispatch({type: 'BUTTON_CLICKED'}),
        ajaxRequestTriggeredMethod: () => dispatch({type: 'AJAX_REQUEST_TRIGGERED'})
    };
};


const BookListContainerExported = connect(mapStateToProps, mapDispatchToProps)(BookListContainer);

所以,我想将 this.props.offset 分配给 of of

var ofst = {this.props.offset};

但这可能不起作用,因为目前我的 GettingJson()生成器是在容器组件之外定义的。

问题№1:是否有必要仅在容器组件内定义ajax请求生成器才能访问 this.props.offset ?也许,还有其他一些方法吗?

问题№2:如果我在容器组件中定义 GettingJson()(作为其中一种方法),我应该如何调用它? 目前它是从redux-saga调用的,它工作正常:

const ApiCallSaga = function*(){

while(yield take('AJAX_REQUEST_TRIGGERED')) 

    try {
        yield put({type:'AJAX_REQUEST_STARTED'});
        const result = yield call(GettingJson);
        yield put({type: 'AJAX_REQUEST_OK'});
    }catch (error){
        yield put({type: 'AJAX_REQUEST_ERROR'});
    }

};

但是当GetJson()被定义为容器的方法时,上面给出的调用不能正常工作,我得到 AJAX_REQUEST_ERROR

1 个答案:

答案 0 :(得分:0)

不应在容器/常规组件中定义Saga生成器。

如果您想在传奇中从商店获取值,请使用select效果。

const offset = yield select((state) => state.offset);
const result = yield call(GettingJson);

如果您想从商店中没有的道具中获取值,请将其发送到动作有效负载中。