Sử dụng một sự kết hợp của phản ứng, Redux và thunk, tôi đã điều sau đây:Vị trí hợp lý để sửa đổi dữ liệu phản hồi trong Redux ở đâu?
actions.js
import $ from 'jquery';
import * as types from '../constants/ActionTypes';
import { API_PATH } from '../constants/Config';
export function coursesLoaded(courses) {
return { type: types.COURSES_LOADED, courses };
}
export function fetchData() {
return (dispatch) => {
return $.getJSON(API_PATH).then((response) => {
dispatch(coursesLoaded(response.result));
});
};
}
reducer.js
import { routerReducer as routing } from 'react-router-redux';
import { combineReducers } from 'redux';
import * as types from '../constants/ActionTypes';
const initialState = {
courses: [],
};
function main(state = initialState, action) {
switch(action.type) {
case types.COURSES_LOADED:
return {
...state,
courses: action.courses,
};
default:
return state;
}
}
const rootReducer = combineReducers({ main, routing });
export default rootReducer;
Hai đoạn trên ngồi tốt, và tôi cảm thấy như họ phù hợp với ý định của Redux. Tôi muốn bây giờ làm một số sửa đổi cho các lĩnh vực được trả lại trong phản ứng, trước khi họ nhấn container.
Ví dụ, phản ứng có thể là:
[
{ code: "R101", name: "Intro to Redux", author: "Dan" },
{ code: "R102", name: "Middleware", author: "Dan" },
]
Và tôi muốn thay đổi nó để (ví dụ đơn giản vì đơn giản):
[
{ code: "R101", name: "Intro to Redux", author: "Dan", additionalProperty: "r101_intro_to_redux" },
{ code: "R102", name: "Middleware", author: "Dan", additionalProperty: "r102_middleware" },
]
nghiên cứu cho đến nay
Tùy chọn Một Nhìn vào ví dụ không đồng bộ trên Redux, tôi có thể thấy ere là một cái chạm nhẹ để phản ứng ở đây: https://github.com/reactjs/redux/blob/master/examples/async/actions/index.js#L33
Lựa chọn Hai Nhìn vào câu hỏi Stackoverflow khác, nó dẫn tôi để tin giữ nó ra khỏi những hành động có ý nghĩa hơn, như gia giảm nên được những gì sẽ thay đổi trạng thái (nhưng có lẽ điều này không thực sự được tính là trạng thái): Redux - where to prepare data
Lựa chọn Ba tôi đã một inclining rằng đây là công việc của middleware - là đó là normalizr xử lý nó như thế nào, nhưng tôi không thể tìm thấy bất kỳ? ví dụ trung gian không thụ động. Nếu middleware là đi ở đây, nên middleware được gửi một số loại hành động SET_STATE, hoặc là nó miễn phí để cập nhật nhà nước phải có trong middleware?
EDIT
thử nghiệm với một số trung gian, chẳng hạn như:
import { lowerCase, snakeCase } from 'lodash';
import * as types from '../constants/ActionTypes';
export default store => next => action => {
if(action.type == types.COURSES_LOADED) {
action.courses = action.courses.map((course) => {
course.additionalProperty = snakeCase(lowerCase(`${course.code} ${course.name}`));
return course;
});
}
return next(action);
}
Có vẻ như để làm việc tốt - là điều này thực sự là ý định của middleware? Câu hỏi ban đầu nắm giữ - nơi mà nó là nơi lý tưởng?
Tôi khuyên bạn nên trích xuất logic tìm nạp API thành 'DataService', cũng có khả năng sửa đổi đối tượng JSON được trả về. Kết quả là '$ .getJSON (API_PATH)' của bạn trở thành 'DataService.getMyData (đường dẫn)', và 'then()' đã có dữ liệu được định dạng chính xác. – lux